如何区分没有颜色的像素和黑色像素?

时间:2013-11-19 19:54:23

标签: ruby image chunkypng

我正在使用 ChunkyPNG 来获取图像上的像素颜色。当图像完全没有背景颜色并渲染到浏览器中时,背景颜色将变为白色(通常取决于您的浏览器配置)。

我的问题是,在使用 ChunkyPNG 分析像素时,完全没有颜色的像素值为rgb(0,0,0),而黑色像素的值为rgb(0,0,0)。有什么方法可以区分它们吗?检查不透明度或......我缺少什么?

这是我的代码:

chunky_image = ChunkyPNG::Image.from_file("test.png")

width = chunky_image.dimension.width
height = chunky_image.dimension.height
(0..width - 1).each do |x|
  (0..height- 1).each do |y|
    red = ChunkyPNG::Color.r(chunky_image[x,y])
    green = ChunkyPNG::Color.g(chunky_image[x,y])
    blue = ChunkyPNG::Color.b(chunky_image[x,y])
    p "red: " + red.to_s
    p "green: " + green.to_s
    p "ble: " + blue.to_s
  end
end

2 个答案:

答案 0 :(得分:5)

您需要使用rgba值而不是rgb值。

如果r,g,b为0且a为255,则为纯黑色

如果r,g,b为0且a> 0但是< 255它仍然是黑色但是或多或少透明

如果a为0,无论r,g,b是完全透明的(你的话都没有颜色)

所以你错过的是Color.a(像素)值。希望你的照片有COLOR_TRUECOLOR_ALPHA

答案 1 :(得分:1)

  

当图像完全没有背景颜色并呈现在浏览器中时,背景颜色将变为白色(通常取决于您的浏览器配置)。

通常通过第4色通道实现“无背景”以编码像素的不透明度。 PNG等图像格式支持Alpha通道,而标准JPEG等图像格式则不支持。大多数现代浏览器都会正确渲染透明像素,以便您可以看到图像“下方”的任何内容(可能是页面的背景颜色,某些文本等)。

像素的实际颜色可以是任何颜色,但它们通常是单一的纯色,用于优化目的(例如:PNG的压缩)。例如,Imagemagick使用白色,而Paint.NET使用黑色。当然,如果您的图像渲染器正确支持Alpha通道,那么它将正确绘制像素。

我不确定您要对像素数据做什么,但您可以使用ChunkyPNG::Color.a来获取Alpha通道的值。 a值为0意味着它完全透明,而255表示它完全不透明。