【发布时间】:2017-12-20 16:39:14
【问题描述】:
我希望能够检测徽标类型图像是否具有透明背景,假设两个相似的图像是 .png 文件,但一个具有白色背景,另一个具有透明背景,如何我能确定一个透明的吗?
我尝试过使用 colorthief,但它没有考虑透明度,所以我想自己在 canvas 上做。第一个解决方案是将png文件转换为jpg,如果转换后jpg的背景颜色看起来是黑色的,那么它是一个透明的标志,但这对于黑色背景的用户来说可能是个问题和白色的标志。还有比这更好的解决方案吗?
从 png 到 jpg:
var imageLoader = document.getElementById('imageLoader');
imageLoader.addEventListener('change', handleImage, false);
var canvas = document.getElementById('imageCanvas');
var ctx = canvas.getContext('2d');
function handleImage(e){
var reader = new FileReader();
reader.onload = function(event){
var img = new Image();
img.onload = function(){
canvas.width = 100;
canvas.height = 100;
ctx.drawImage(img,0,0, 100, 100);
document.getElementById("image").src = canvas.toDataURL("image/jpeg");
}
img.src = event.target.result;
}
reader.readAsDataURL(e.target.files[0]);
}
【问题讨论】:
-
“第一个解决方案是将 png 文件转换为 jpg”
-
可能有很多方法可以做到这一点,一种是按照您的建议进行操作,也许通过检查所有像素并确定一定数量的像素是否与背景颜色相同。使用另一个图像作为背景将使得大量像素不太可能相同等。但是,正确的做法是将图像发送到服务器,并使用 ImageMagick 检查 alpha 通道。跨度>
-
@lilezek 是的,我明白这一点,但我是说在我的 jsfiddle 上它是黑色的,我可以用它来检测背景是否透明
-
“但是在将 png 文件转换为 jpg 时,如果图像是透明的,则会得到黑色背景” - 这将如何帮助您确定您的 PNG 是否带有透明背景,还是一开始是黑色的?我认为将 PNG 复制到画布上并使用 getImageData 并检查每个像素的 alpha 级别将是一种可行的方法(假设将包含此类透明部分的图像复制到空画布上会保持这些值不变。)
-
我猜这有点问题,任何插入到画布中的不是来自同一来源的图像都会被污染,因此 JSFiddle 上使用的任何图像都必须来自该来源跨度>
标签: javascript image html5-canvas transparency