Próbuję przekonwertować ten kod Java do Pythona:

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
.....

Próbowałem tego w Pythonie:

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);

Problemem jednak jest to, że otrzymuję różne wartości w Pythonie.

Dlaczego Java zwraca negatywne wartości całkowite i jak mogę uzyskać ten sam wynik w Pythonie?

0
razz 18 sierpień 2014, 11:05

2 odpowiedzi

Najlepsza odpowiedź

Ta funkcja powinna konwertować kolor z formatu Python do formatu 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

Należy pamiętać, że format Pythona jest doskonale rozsądny - zapewnia bezpośrednio dokładnie R, G, B i wartości bezpośrednio. To java, która ma dziwny format.

Dostajesz wartości ujemne w Javie z powodu przepełnienia całkowitego - na przykład 0xFFFFFFFF (lub 4294967295), co jest czystym białym, zawija się do -1.

1
user253751 18 sierpień 2014, 07:18

Wartość Java getRGB() jest podpisaną 32-bitową liczbą całkowitą z wartościami Alpha, R, G i B w każdym z 8 bitów z większości do najmniej znaczących bajtów.

Możesz "odtworzyć" taką samą wartość z:

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])
1
Martijn Pieters 18 sierpień 2014, 07:59