2014-08-18 3 views
0

Я пытаюсь преобразовать этот код Java в Python:Как получить RGBA значение цвета на пиксель изображения в питона

BufferedImage image; 
FileInputStream fstream1 = new FileInputStream("image.png") 
image = ImageIO.read(fstream1); 
int max = -40000000; //Java rgb returns negative values 

for (int i = 0; i < 128; i++) 
{ 
    for (int j = 0; j < 255; j++) 
    { 
     color = image.getRGB(j, i); //returns integer 
..... 

Я попытался это в Python:

from PIL import Image 

image = Image.open("image.png").convert("RGBA") 
pixels = image.load() 

for i in range(128): 
    for j in range(255): 
     color = pixels[j, i] #returns (R, G, B, A); 

Проблема однако что я получаю разные значения в python.

Почему Java возвращает отрицательные целочисленные значения и как получить тот же результат в python?

+0

Java возвращает целое число, в котором отдельные байты представляют отдельные цветовые каналы (я не знаю точный порядок) – hlt

+0

Почему вы хотите отрицательные значения? – immibis

+0

Я спросил, почему ... – immibis

ответ

1

Эта функция должна преобразовать цвет из формата Python в формат Java:

def convertPixel(c): 
    x = c[0] << 16 | c[1] << 8 | c[2] | c[3] << 24 
    if x >= 1<<31: 
     x -= 1<<32 
    return x 

Обратите внимание, что формат Пайтона абсолютно нормален - это дает вам точные значения R, G, B и A напрямую. Это Java, который имеет странный формат.

Вы получаете отрицательные значения в Java из-за целочисленного переполнения - например, 0xFFFFFFFF (или 4294967295), который является чисто белым, обертывается до -1.

+0

он работал отлично, спасибо, что я никогда не мог понять себя wierd formula :) – razzak

+0

только один вопрос, имеет ли это значение какое-либо значение свойства цвета? может быть, или насыщенность! – razzak

+0

@razzak Это R/G/B/A, упакованный в одно целое. Если вы относитесь к нему как к одному номеру, это не очень полезно. Почти все, что вы можете сделать, это переместить его и распаковать (обратно в значения R/G/B/A) – immibis

1

Значение Java getRGB() представляет собой подписанное 32-битовое целое число с значениями альфа, R, G и B в каждом из 8 бит от большинства до наименее значимых байтов.

Вы можете «воспроизвести» то же самое значение с:

def packRGBA(r, g, b, a) 
    val = a << 24 | r << 16 | g << 8 | b 
    if a & 0x80: 
     val -= 0x100000000 
    return val 

color = packRGBA(*pixels[j, i]) 
Смежные вопросы