【发布时间】:2014-09-11 13:19:45
【问题描述】:
我正在尝试对图像进行双色调处理并将其粘贴到画布上。
适用于桌面浏览器:
- 铬
- 火狐
- 野生动物园
- Internet Explorer
在移动浏览器中失败:
- 安卓
Workable demo on JSFiddle,此示例在 Chrome 中有效,但在 Android 的默认浏览器中失败。
代码是:
<style>
body {
background-color: gray;
}
</style>
<canvas id="mycanvas" width="64" height="64"></canvas>
<script>
var image = new Image();
image.src = 'image.png';
image.onload = function () { //once the image finishes loading
var context = document.getElementById("mycanvas").getContext("2d");
context.drawImage(image, 0, 0);
var imageData = context.getImageData(0, 0, 64, 64);
var pixels = imageData.data;
var numPixels = pixels.length;
for (var i = 0; i < numPixels; i++) { //for every pixel in the image
var index = i * 4;
var average = (pixels[index] + pixels[index + 1] + pixels[index + 2]) / 3;
pixels[index] = average + 255; //red is increased
pixels[index + 1] = average; //green
pixels[index + 2] = average; //blue
//pixels[index + 3] = pixels[index + 3]; //no changes to alpha
}
context.clearRect(0, 0, 64, 64); //clear the image
context.putImageData(imageData, 0, 0); //places the modified image instead
}
</script>
总结是:
- 将背景颜色设置为灰色,以便更容易观察到 Alpha
- 创建一个 64 x 64 的画布
- 在透明背景上加载笑脸图像
- 将图像绘制到画布上
- 获取图片数据
- 对于每个像素,使红色更强烈
- 替换画布上更改的图像
笑脸看起来像这样(被块引用,所以你可以看出它是透明的):
但是,与 chrome 和 android 浏览器相比,
android绘图的背景是红色的,而chrome绘图是完全透明的。
所以...
- 这里发生了什么?
- 如何更改代码以使android绘图与chrome绘图匹配?
注意:我已经尝试过if (pixels[index + 3] == 0) continue;,我知道这一点,但它不适用于具有不同不透明度的图像。
【问题讨论】:
-
您是否已将 png 保存为 24 格式?
-
@romaneso 不,它是 32 位 RGBA。考虑到 RGBA requires 32 bits,我什至认为 24 位 RGBA 是不可能的。
-
哦,没错。不妨试试 gif 格式
-
@Thouartamazing 它还必须在网络服务器上运行,制作
.html文件并直接使用 chrome 运行它是行不通的。它还应该在网络服务器上,以便您可以使用 android 设备对其进行测试。
标签: javascript android canvas alpha