代码之家  ›  专栏  ›  技术社区  ›  AAlvz

使用Python Pillow,来自字节的PNG图像变为黑色。如何保持颜色?

  •  0
  • AAlvz  · 技术社区  · 1 年前

    我想旋转这个图像。

    enter image description here

    我将其作为字节与:

    img = Image.open(image_path)
    img.tobytes()
    

    但当我解码它时:

    image = Image.frombytes('P', (width, height), image_data)
    

    我得到一个黑色方块。

    如何从字节中读取图像并保留颜色?这种情况发生在PNG图像上。

    我得到的最远的是一个黑色背景,白色原始图像的形状几乎不明显。 具有

    image = Image.frombytes('P', (width, height), image_data).convert('L')
    

    我在用枕头。我愿意使用任何东西。

    0 回复  |  直到 1 年前
        1
  •  1
  •   SuperStormer    1 年前

    根据 https://github.com/python-pillow/Pillow/issues/6788 ,这就是图像变为黑色的原因:

    P模式的理念是有一个多达256种颜色的调色板,图像中的每个像素都是这些颜色中的一种。tobytes()只写出图像像素的索引,而不是调色板。因此,图像变成黑色是因为当它将这些索引转换回图像时,没有调色板来告诉它每个像素是什么颜色。

    该问题列出了几种替代方案:

    • 您可以单独保存调色板,然后将其应用于最后的新图像。
    • 您可以将图像从P转换为RGB或RGBA。
    • 您可以将图像保存为特定的图像格式(例如PNG),然后从中加载回图像。

    对我来说,第二个选项看起来是最简单的,所以让我们实现它:

    image_path = "aJpWQ.png"
    img = Image.open(image_path)
    
    width, height = img.size
    converted = img.convert("RGBA")
    image_data = converted.tobytes()
    
    # insert transformations here
    
    image = Image.frombytes('RGBA', (width, height), image_data)