如何在python中获取图像像素的RGBA颜色值

时间:2014-08-18 07:05:22

标签: java python

我试图将此java代码转换为python:

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中得到相同的结果?

2 个答案:

答案 0 :(得分: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

请注意,Python的格式非常合理 - 它直接为您提供精确的R,G,B和A值。它的Java具有奇怪的格式。

由于整数溢出,你在Java中得到负值 - 例如0xFFFFFFFF(或4294967295),它是纯白色,回绕到-1。

答案 1 :(得分:1)

Java getRGB()值是一个带符号的32位整数,在从最高到最低有效字节的8位中的每一位中都包含alpha,R,G和B值。

您可以使用以下方式'重现'相同的值:

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