【问题标题】:I cannot set the pixel data of a PNG image我无法设置 PNG 图像的像素数据
【发布时间】:2019-10-23 03:09:49
【问题描述】:

我有大量图片。有些是JPEG,有些是PNG。对于 PNG,我正在制作一个将所有透明像素转换为纯白色的程序。但是,它不仅不起作用,而且一些背景会变成随机颜色,例如红色和绿色。我不知道我做错了什么,所以这是我的代码:

import os
from PIL import Image

files = os.listdir("/Users/Riley/PycharmProjects/myNN/logos")

for file in files:
    print(file)

    image = Image.open("/Users/Riley/PycharmProjects/myNN/logos/" + file)
    pixels = image.load()

    if image.mode == 'RGBA':
        print("RGBA")
        for x in range(image.size[0]):
            for y in range(image.size[1]):
                if pixels[x, y][3] < 1:
                    pixels[x, y] == (255, 255, 255, 1)
                    print(pixels[x, y])

        image = image.convert('RGB')

print(pixels[x, y]) 用于故障排除。我没有收到任何错误,但它会打印出随机的 RGBA 值,尽管刚刚将其设置为 (255, 255, 255, 1)。 谢谢。

【问题讨论】:

  • 有趣的问题。你能提供一个演示问题的示例图像吗?我尝试在我用 MS Paint 制作的 png 上运行你的代码,它似乎工作正常。

标签: python image-processing png python-imaging-library


【解决方案1】:

您不需要这样做。制作一张与透明图片相同大小的白色新图片,然后将透明图片粘贴到顶部,白色会透出来,这样会更容易、更快捷。

from PIL import Image

# Open original with transparency
im = Image.open('image.png').convert('RGBA')

# Make white background same size
white = Image.new('RGB',im.size,color='white')

# Paste onto background
white.paste(im,mask=im)

# Save
white.save('result.png')

顺便说一句,您完全无需编写任何 Python 即可做到这一点,只需使用安装在大多数 Linux 发行版上且可用于 macOS 和 Windows 的 ImageMagick

首先,创建一个输出目录:

mkdir output

然后将所有 PNG 一次性压平到白色背景上:

magick mogrify -path output -background white -flatten /Users/Riley/PycharmProjects/myNN/logos/*png

如果您的 ImageMagick 是 v6 或更早版本,请删除 magick 并使用:

mkdir output
mogrify -path output -background white -flatten /Users/Riley/PycharmProjects/myNN/logos/*png

【讨论】:

  • 我添加了一些关于更简单方法的额外信息。
  • 好的所以我没有测试终端方法,但是我只是测试了Python方法,问题仍然存在。它适用于某些图像,但对于其他图像,图像大部分是黑色的,原始图像有一点轮廓。
  • 因此,当 alpha 为 0 或 1 时,这似乎有效,但在两者之间的任何地方都无效。我不确定这里的解决方案是什么。
【解决方案2】:

pixels[x, y] == (255, 255, 255, 1) 是一个比较,而不是一个赋值。

您可能希望将该语句替换为 pixels[x, y] = (255, 255, 255, 1)

【讨论】:

  • @RileyFitzpatrick:使用合适的 IDE,它将防止所有琐碎的错误。
  • ?我从来没有听说过 PyCharm 有什么不好的地方。
  • @Riley:如果您在该行没有收到警告,则说明您在 PyCharm 中禁用了太多警告,或者它不是一个好的 IDE。当您计算某些内容并丢弃其结果时,一个好的 IDE 应该会发出警告。
猜你喜欢
  • 1970-01-01
  • 2020-08-05
  • 1970-01-01
  • 1970-01-01
  • 2014-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-26
相关资源
最近更新 更多