【问题标题】:BytesIO replaces transparency in PNG files with black backgroundBytesIO 用黑色背景替换 PNG 文件中的透明度
【发布时间】:2018-12-11 10:44:25
【问题描述】:

我想在我的“图像”变量中保持透明背景。

如果我写入文件,图像看起来很好。我的意思是图像具有透明背景。

with urllib.request.urlopen(request) as response:
     imgdata = response.read()
     with open("temp_png_file.png", "wb") as output:
         output.write(imgdata)

但是,如果我将图像数据保存在 BytesIO 中,透明背景就会变成黑色背景。

with urllib.request.urlopen(request) as response:
     imgdata = response.read()
ioFile = io.BytesIO(imgdata) 
img = Image.open(ioFile)
img.show()

(上面的代码片段,img.show 行显示了一个黑色背景的图像。)

如何在 img 变量中保留透明图像对象?

【问题讨论】:

  • 尝试将img = Image.open(ioFile)更改为img = Image.open(ioFile).convert('RGBA')
  • @MarkSetchell,谢谢你,马克!这是这个问题的解决方案。但是,我也坚持下一步。我需要将其转换为 OpenCV 图像对象。我这样做了:“opencvImage = cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR)” 而且,opencvImage 也显示黑色背景。你知道如何解决这个问题吗?
  • 您的图像在convert('RGBA') 之后是RGBA,因此您需要决定如何处理透明度。 OpenCV 的imshow() 不处理透明度,所以在那里看起来会出错,但如果你将它写入文件就可以了。 PIL/Pillow 提供了一种show() 方法,它确实理解透明度,因此您可以先使用from PIL import Image,然后使用Image.fromarray(numpyImage).show(),其中numpyimage 是OpenCV 图像或Numpy ndarray。
  • 谢谢@MarkSetchell。回复问题,这样我就可以标记为答案了。

标签: python-3.x image python-imaging-library urllib bytesio


【解决方案1】:

两件事...


首先,如果您在使用Pillow 打开文件时想要并期望得到 RGBA 图像,最好将您输入的任何内容转换为该图像 - 否则您最终可能会尝试显示调色板索引而不是 RGB 值:

所以改变这个:

img = Image.open(ioFile)

到这里:

img = Image.open(ioFile).convert('RGBA')

其次,OpenCV的imshow()不能处理透明度,所以我倾向于使用Pillow的show()方法代替。像这样:

from PIL import Image

# Do OpenCV stuff
...
...

# Now make OpenCV array into Pillow Image and display
Image.fromarray(numpyImage).show()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-20
    • 2014-11-12
    • 2012-06-26
    • 2015-02-03
    • 2018-04-24
    • 1970-01-01
    • 1970-01-01
    • 2019-01-03
    相关资源
    最近更新 更多