使用 javascript canvas 调整图像大小(平滑)

2024-02-05

我正在尝试用画布调整一些图像的大小,但我不知道如何平滑它们。 在 Photoshop、浏览器等上。他们使用一些算法(例如双三次、双线性),但我不知道这些算法是否内置在画布中。

这是我的小提琴:http://jsfiddle.net/EWupT/ http://jsfiddle.net/EWupT/

var canvas = document.createElement('canvas');
var ctx = canvas.getContext('2d');
canvas.width=300
canvas.height=234
ctx.drawImage(img, 0, 0, 300, 234);
document.body.appendChild(canvas);

第一个是正常调整大小的图像标签,第二个是画布。请注意画布并不那么光滑。如何才能达到“流畅”?


您可以使用降步来获得更好的结果。大多数浏览器似乎使用线性插值而不是双三次插值 http://entropymine.com/resamplescope/notes/browsers/调整图像大小时。

(Update规格中增加了质量属性,imageSmoothingQuality https://devdocs.io/dom/canvasrenderingcontext2d/imagesmoothingquality目前仅在 Chrome 中可用。)

除非选择不平滑或最近邻,否则浏览器将始终在缩小图像后对图像进行插值,因为此功能充当低通滤波器以避免混叠。

双线性使用 2x2 像素进行插值,而双三次使用 4x4 像素进行插值,因此通过逐步执行,您可以在使用双线性插值时接近双三次结果,如结果图像中所示。

var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
var img = new Image();

img.onload = function () {

    // set size proportional to image
    canvas.height = canvas.width * (img.height / img.width);

    // step 1 - resize to 50%
    var oc = document.createElement('canvas'),
        octx = oc.getContext('2d');

    oc.width = img.width * 0.5;
    oc.height = img.height * 0.5;
    octx.drawImage(img, 0, 0, oc.width, oc.height);

    // step 2
    octx.drawImage(oc, 0, 0, oc.width * 0.5, oc.height * 0.5);

    // step 3, resize to final size
    ctx.drawImage(oc, 0, 0, oc.width * 0.5, oc.height * 0.5,
    0, 0, canvas.width, canvas.height);
}
img.src = "//i.imgur.com/SHo6Fub.jpg";
<img src="//i.imgur.com/SHo6Fub.jpg" width="300" height="234">
<canvas id="canvas" width=300></canvas>

根据调整大小的剧烈程度,如果差异较小,您可以跳过步骤 2。

在演示中,您可以看到新结果现在与图像元素非常相似。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 javascript canvas 调整图像大小(平滑) 的相关文章

  • 如何在 Jest 测试中模拟 StatusBarManager.getHeight?

    我正在使用 expo 34 并且反应本机用户界面库 https www npmjs com package react native ui lib来自 wix 并且在为我的组件设置笑话测试时遇到问题 问题看起来出现在link https g
  • 如何从 Firefox 中的选择元素中删除箭头

    我正在尝试设计一个select使用 CSS3 的元素 我在 WebKit Chrome Safari 中得到了我想要的结果 但 Firefox 的表现不佳 我什至不关心 IE 我正在使用 CSS3appearance属性 但由于某种原因我无
  • React.js this.props.data.map() 不是一个函数

    我正在搞乱反应并尝试解析和渲染 json 对象 现在 我只是使用硬编码对象设置它以进行测试 而不是从 ajax 调用中获取它
  • Javascript 根据字段值任意排序数组

    所以我有一个对象数组 如下所示 var myArray priority low priority critical priority high 我需要以这种方式排序 1 关键 2 高和3 低 如何才能做到这一点 我建议使用一个对象来存储排
  • Bootstrap 3 - 使用垂直滚动条水平拖动元素,overflow-y:滚动

    在我的失败之后上一篇文章 https stackoverflow com questions 23586926 bootstrap grid with scrollable affixed column noredirect 1 comme
  • 如何防止在达到一定字符数后向文本区域输入内容?

    使用下面的代码 任何超过指定最大值的输入都将被删除 但这会产生一种效果 即键入字符后立即将其删除 我宁愿简单地阻止输入字符
  • 表单提交不起作用

    我有一张桌子 可以打印出所有可用的相机 它使用表单来更改这些设置 问题在于该表单仅更新条目中的最后一个摄像机 换句话说 如果我更改表单并为列表中的最后一个摄像机点击 应用 它将起作用 如果我更改此列表中任何其他摄像机的表单 它会将其更改为与
  • 使图像宽度为父 div 的 100%,但不大于其自身宽度

    我试图让图像 动态放置 对尺寸没有限制 与其父 div 一样宽 但前提是该宽度不比 100 时其自身宽度宽 我已经尝试过这个 但没有成功 img width 100 height auto max width 100 其中许多图像比它们的父
  • 函数声明或函数表达式

    我刚刚在块作用域中定义函数时遇到了问题 考虑以下程序 try greet function greet alert Merry Christmas catch error alert error 我希望这个程序能够发出警报Merry Chr
  • 如何混淆或使 JavaScript 文件不可读?

    我的应用程序中有 JavaScript 脚本 其中包含 JavaScript 和 jQuery 函数 所有用户与我的应用程序的交互都是动态的 并且通过 jQuery 传递到应用程序 我意识到 当我在客户端运行我的应用程序时 客户端可以通过查
  • 传单 - 导入 Geojson - Angular 6

    我尝试将 GeoJson 文件导入到 Angular 的应用程序 6 中的传单中 通过这个解决方案 我的 geojson 是在 leafletmap 中绘制的 但我有这个错误 我无法构建我的应用程序 有人知道一种解决方案吗 错误 TS234
  • jQuery 面板滑块通过单击按钮打开但不会关闭

    我的页面上有一个按钮 可以使用 jquery 和 Modernizr 框架打开右侧面板 按钮位于屏幕最右侧 单击时 它会向左滑动并打开打开的面板 问题是 再次单击时它不会滑回到原来的位置 HTML div class cd panel fr
  • 自动调整元素 (div) 大小以适合水平内容

    我尝试谷歌搜索 但没有得到太多结果 我正在构建一个水平轮播 它在浮动的 LI 中显示图像 我想解决的问题是 每次我向轮播添加缩略图 我是延迟加载 时 我都需要重新计算轮播的宽度 以便所有浮动缩略图很好地并排排列 其一 我宁愿不必在 JS 中
  • 尽管给出了供应商 ID,Web 串行 api 显示“未找到兼容设备”

    Windows 8 1 Chrome v91 0 4472 164 我已根据设备管理器验证了供应商和产品 ID 该设备是使用 Ch340 驱动程序的 Arduino UNO 它在设备管理器中的端口 COM 和 LPT 下列为 USB SER
  • jQuery 显示/隐藏兄弟姐妹

    我有这段代码 旨在首先隐藏除第一个元素之外的所有相关元素 这个 做的不错啊接下来 它应该根据选择的项目显示 隐藏这些元素 但这部分不起作用 想法 jQuery accordion dl not first child hide hide a
  • 如何将外部 div 的高度设置为始终等于特定内部 div 的高度?

    我有一个外部 div 其中包含三个内部 div 我希望最左边的内部 div 始终确定外部 div 的高度 如果其他内部 div 的内容 比最左边的 div 少 它们将有空白空间 如果他们有更多的内容 比最左边的div 他们将得到一个滚动条
  • Firestore != 查询错误:“”!=”类型的参数无法分配给“WhereFilterOp”类型的参数。ts(2345)

    我的打字稿编译器有问题 此查询出现错误 const xxx admin firestore collection xxx where end timestampDate where end lt timestampDate get 错误 类
  • 使用重复模式捕获正则表达式

    我试图捕获字符串的所有部分 但我似乎无法正确处理 该字符串具有以下结构 1 22 33 中间有运算符的数字 可以有任意数量的术语 我想要的是 1 22 33 1 22 33 但我得到 1 22 33 22 33 我尝试过各种正则表达式 这是
  • 在64位环境中加载32位进程

    我有以下几个问题 CHM 是 编译的 HTML 文件 我的 CHM 文件有一个启动 32 位应用程序的链接 CHM 文件是用 Javascript 编码的 这在 32 位操作系统环境中运行良好 但这在 64 位操作系统环境中不起作用 原因是
  • 谷歌地图绘制两点之间的路线

    我编写了这段无辜的 JavaScript 代码 它允许用户创建两个标记并绘制它们之间的路线 它不起作用 相反 它给出了一个奇怪的错误 Uncaught TypeError Cannot read property ya of undefin

随机推荐

  • Dart 中有编译器预处理器吗?

    由于在启动 dart 应用程序之前需要进行编译 我想知道编译器预处理器是否可用 或者是否计划在不久的将来为 Dart 提供 到目前为止 我在网络上 在 dart 网站内部的搜索均未成功 通过预处理器 我的意思是 define max A B
  • Django:有没有办法知道应用程序中的网址是否有效?

    这是我的目标 用户想要登录 我在每个页面上创建一个按钮 并以 urlback 作为参数 例如 如果我们在该页面上http olivier life today 登录按钮将有一个像这样的 urlhttp olivier life login
  • 为什么我不能给指针赋值?

    在阅读了常见问题解答和我能找到的所有其他内容后 我仍然感到困惑 如果我有一个以这种方式初始化的 char 指针 char s Hello world 该字符串位于只读存储器中 我无法像这样更改它 s W 制作 Hello world 我明白
  • spring mvc中如何管理/存储后续请求的请求参数?

    我经常使用场景 列出用户 在ajax调用上 在搜索页面上 搜索按钮后单击一些搜索条件 我有 jQuery 数据表中的用户列表 点击编辑用户在数据表中 我单击以从列表中编辑用户 我重定向到用户更新表单 其中填充了用于更新目的的用户字段 更新用
  • “selectedFilters”不是有效的关键字参数

    我使用 PyQt5 当我尝试保存文件名时出现错误 csv file list QtWidgets QFileDialog getOpenFileName self Open file csv fileName csv file list f
  • 防止 AngularJs 使用 jQuery 库

    Question 如何防止 AngularJs 使用 jQuery 背景 我正在 AngularJs 中开发一个独立的应用程序 可以 插入 到现有的客户端网站中 这些客户端网站可能已经使用 jQuery 如果您使用过 AngularJs 您
  • 程序在发生任何事情之前就在调试器中崩溃了

    我正在使用 MinGW 工具链构建一个适用于 Windows XP 的应用程序 它有时会意外崩溃 因此 我尝试使用调试器 Gdb 但程序在发生任何事情之前都会以代码 03 退出 事实上 我从GDB看到的只是 新线程3184 0x7b8 新线
  • @SpringBootTest 导致“未找到给定包含的测试”

    我有简单的单元测试 它启动我的应用程序并测试某些服务是否已实例化 有点像健全性检查 但是 这些测试并未在我的完整测试套件中运行 当单独运行时 我收到错误No tests found for given includes com exampl
  • 如何忽略 new Date() 上的时区?

    我有一个名为的 JavaScript 函数updateLatestDate接收作为参数的对象数组 数组中对象的属性之一是MeasureDate日期类型的属性 功能updateLatestDate返回数组中存在的最新日期 这是函数 funct
  • spring boot/batch 通过代码禁用批量自动启动

    我正在编写一个 Spring Batch 应用程序 其中包含需要按特定顺序执行的不同作业 为了做到这一点 我通过 JobLauncher 手动运行作业 并通过在属性文件中添加以下属性来禁用 Spring 批处理提供的自动启动功能 sprin
  • Spring的未来-XD [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我听到有传言称 Spring XD 失去了开发动力 并且 Spring 转向云服务 由于我正在考虑 XD 我考虑的另一个是 Apache B
  • executeScript 未定义或不是 ManifestV3 扩展中的函数

    为什么 Chrome 的这个功能不起作用 我正在尝试这个例子 https developer chrome com docs extensions mv3 content scripts programmatic https develop
  • 将资源添加到 JAR

    我想将资源文件 图像 文本文件 包含在 JAR 中 我将资产文件夹添加到类路径中 因此当我在 netBeans 中运行我的程序时 它可以正常工作 但是如果我构建项目 我会收到错误 Not copying library C Users Fl
  • 如何将 Access-Control-Allow-Origin 添加到 jetty 服务器

    我有一个码头服务器来运行我的网络服务 最近 我开发了一个使用 Web 服务的程序 并遇到了 Access Control Allow Origin 问题 如何将 Access Control Allow Origin 添加到 jetty 嵌
  • 如何通过位置和分隔符提取字符串的子字符串

    我们如何从字符串中分割子字符串 就像我有绳子一样 String mainString Trade Time Trade Number Amount Rs 现在我有其他字符串 String subString Amount 然后我想提取子字符
  • 使用烧瓶中的数据参数重定向

    我试图学习 Flask 并遇到了以下问题 这是我试图实现的示例 app route poll methods GET POST def poll form PollForm if form validate on submit return
  • 如何将 EditText 输入限制为数字(可能是十进制和带符号)输入?

    我读过了Android 将 EditText 限制为数字 https stackoverflow com questions 5200689 android limiting edittext to numbers and 如何在 andr
  • tftp put 的 inotify 事件 IN_MODIFY 发生两次

    我正在使用 inotify 来监听对文件的修改 当我测试文件修改时 程序运行正常 echo test gt tftpboot TEST Output Read 16 data IN MODIFY 但是当我执行 tftp put 时 会生成两
  • CSS 中的“$”是什么意思?

    我看到一个动画项目 里面有一堆 我不知道美元符号在 CSS 中的用途 我猜这是为了动画 这是我正在查看的一些代码的示例 emoji base color FFDA6A emoji like color 548DFF emoji like b
  • 使用 javascript canvas 调整图像大小(平滑)

    我正在尝试用画布调整一些图像的大小 但我不知道如何平滑它们 在 Photoshop 浏览器等上 他们使用一些算法 例如双三次 双线性 但我不知道这些算法是否内置在画布中 这是我的小提琴 http jsfiddle net EWupT htt