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

0 投票
2 回答
1881 浏览
提问于 2025-04-18 17:37

我正在尝试把这段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的不一样。

为什么Java会返回负整数值,我该如何在Python中得到相同的结果呢?

2 个回答

1

Java中的getRGB()方法返回的是一个带符号的32位整数,这个整数包含了透明度(alpha)、红色(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])
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),表示纯白色,但在Java中会变成-1。

撰写回答