4

我正在使用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
4

2 回答 2

5

您需要 rgba 值而不是 rgb 值。

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

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

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

所以你错过的是 Color.a(pixel) 值。希望你的图片有 COLOR_TRUECOLOR_ALPHA

于 2013-11-19T20:07:59.683 回答
1

当图像完全没有背景色,并且被渲染到浏览器中时,背景色将变为白色(通常,取决于您的浏览器配置)。

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

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

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

于 2013-11-19T21:02:48.650 回答