Как провести различие между пикселем без цвета и черным пикселем?

Я использую 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 ответа

Решение

Вам нужно значение rgba вместо значения rgb.

если r, g, b равно 0 и а равно 255, то это сплошной черный цвет

если r, g, b равно 0 и а равно> 0, но < 255, оно все еще черное, но более или менее прозрачное

если a равно 0, независимо от того, что r, g, b, оно полностью прозрачно (в ваших словах нет цвета)

Так что вам не хватает значения Color.a(пиксель). Надеюсь, ваша фотография имеет COLOR_TRUECOLOR_ALPHA

Если изображение вообще не имеет цвета фона и отображается в браузере, цвет фона станет белым (обычно в зависимости от конфигурации браузера).

"Без фона" обычно достигается через 4-й цветовой канал для кодирования непрозрачности пикселя. Форматы изображений, такие как PNG, поддерживают альфа-каналы, в то время как другие, такие как стандартный JPEG, не поддерживают. Большинство современных браузеров правильно отображают прозрачные пиксели так, чтобы вы могли видеть все, что находится "под" изображением (это может быть цвет фона страницы, некоторый текст и т. Д.)

Фактический цвет пикселя может быть любым, но обычно это один сплошной цвет для целей оптимизации (например, сжатие в случае PNG). Например, Imagemagick использует белый, в то время как Paint.NET использует черный. Конечно, если ваш рендерер изображений правильно поддерживает альфа-каналы, то он будет правильно рисовать пиксель.

Я не уверен, что вы хотите сделать с данными пикселей, но вы можете использовать ChunkyPNG::Color.a чтобы получить значение альфа-канала. a значение 0 означает, что оно полностью прозрачно, а 255 означает, что это полностью непрозрачно.

Другие вопросы по тегам