画布中的图像操作
Image manipulation in canvas
我在#mycontainer
中有许多图像,如:
<div id="mycontainer">
<img src="http://localhost:8080/images/my-image.png" />
…
</div>
我需要把它们转换成B/W。这是一项非常常见的任务,但我并没有找到任何适合我的解决方案——操作执行存在一些问题。我现在拥有的是:
function grayscale(src) {
var ctx = document.createElement('canvas').getContext('2d'),
imgObj = new Image(),
pixels, i, n, gs, url;
// wait until the image has been loaded
imgObj.onload = function () {
ctx.canvas.width = this.width;
ctx.canvas.height = this.height;
ctx.drawImage(this, 0, 0);
pixels = ctx.getImageData(0, 0, this.width, this.height);
for (i = 0, n = pixels.data.length; i < n; i += 4) {
gs = pixels.data[i] * 0.3 + pixels.data[i+1] * 0.59 + pixels.data[i+2] * 0.11;
pixels.data[i] = gs; // red
pixels.data[i+1] = gs; // green
pixels.data[i+2] = gs; // blue
}
ctx.putImageData(pixels, 0, 0);
};
imgObj.src = src;
return ctx.canvas.toDataURL('image/png');
}
一般情况下,行动是:
- 我提供要处理的图像的CCD_ 2
- 等待图像被完全加载
- 在画布上绘制图像,转换像素,然后将转换后的像素放回画布上
- 然后我希望返回画布中生成的图像的数据URL
现在,当在开发者工具中,我正在字符串类似于:
c = $('#mycontainer').find('img')[0];
grayscale(c.src);
我得到一个完全透明的默认300px x 150px画布的数据URL,就好像脚本中根本不存在imgObj.onload()
一样。
有人能给我指出这里的一个错误吗?
快速回答:由于您使用的是jQuery,您可能会查看jQuery去饱和插件,它可能会满足您的需要。
参考您的代码的较长答案-imgObj.onload
是一个异步回调函数,因此在您到达return
语句时它还没有执行。您需要从onload
回调中执行任何需要post-onload
数据URL的代码。一种方法是让grayscale
接受回调参数:
function grayscale(src, callback) {
// ... snip ...
// wait until the image has been loaded
imgObj.onload = function () {
// ... snip ...
ctx.putImageData(pixels, 0, 0);
// now fire the callback
callback(ctx.canvas.toDataURL('image/png'));
};
imgObj.src = src;
}
c = $('#mycontainer').find('img')[0];
grayscale(c.src, function(dataUrl) {
// further stuff with grayscale dataUrl
});
相关文章:
- 通过javascript操作图像,非常简单
- 如何阻止图像移动并根据击键进行操作
- 当我在操作属性中写入页面名称时,文件图像不会上传
- 更改“将图像另存为”的操作以重定向到相应的网页
- 在web浏览器中保存操作过的SVG图像
- AngularJS,如何操作通过$resource获得的图像
- 单击图像不执行任何操作
- 如何使用滑动、缩放和裁剪在 jquery 中操作图像的大小或位置
- 如何使用jQuery检查图像URL是否为空并执行某些操作
- 离子在加载所有图像和内容时执行操作
- 使用Javascript上传图像(操作)到Facebook
- 重置操作的图像
- 如何在上传到画布后操作图像(FabricJS)
- 操作方法:将鼠标悬停在图像上并制作动画绘制一条线,说明淡出
- 在执行 h:命令链接操作时显示工作图像
- 无法使用缩放按钮操作图像
- 在操作方法中保存图像,然后将 URL 返回给客户端
- 如何使用jQuery操作图像-仅限水平
- 使用html画布和JS操作图像上的像素数据
- 通过触摸操作图像:IOS