转换为RGB会返回一个RGBA图像。

4
我正在尝试使用Python和PIL向图像添加一些文本。 我在将结果图像保存为JPG时失败了。
我基于https://pillow.readthedocs.io/en/5.2.x/reference/ImageDraw.html#example-draw-partial-opacity-text上给出的示例进行操作。
from PIL import Image, ImageDraw, ImageFont

def example():
    base = Image.open('test.jpg').convert('RGBA')
    txt = Image.new('RGBA', base.size, (255,255,255,0))
    fnt = ImageFont.truetype('/Library/Fonts/Chalkduster.ttf', 40)
    drw = ImageDraw.Draw(txt)
    drw.text((10,10), "HELLO", font=fnt, fill=(255,0,0,128))
    result= Image.alpha_composite(base, txt)
    result.convert('RGB')
    print ('mode after convert = %s'%result.mode)
    result.save('test1.jpg','JPEG')
example()

运行此代码会打印出 mode after convert = RGBA,然后接着输出。
Traceback (most recent call last):
  File "/Users/carl/miniconda3/envs/env0/lib/python3.7/site-packages/PIL/JpegImagePlugin.py", line 620, in _save
    rawmode = RAWMODE[im.mode]
KeyError: 'RGBA'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "example.py", line 14, in <module>
    example()
  File "example.py", line 12, in example
    result.save('test1.jpg','JPEG')
  File "/Users/carl/miniconda3/envs/env0/lib/python3.7/site-packages/PIL/Image.py", line 2007, in save
    save_handler(self, fp, filename)
  File "/Users/carl/miniconda3/envs/env0/lib/python3.7/site-packages/PIL/JpegImagePlugin.py", line 622, in _save
    raise IOError("cannot write mode %s as JPEG" % im.mode)
OSError: cannot write mode RGBA as JPEG

在进行RGB转换函数后,图像仍然是RGBA格式。我做错了什么?


请提供您的test.jpg文件。谢谢。 - jose_bacoy
我不太确定,你的代码动机是什么?比如说,你想创建半透明文本,但是你又试图以RGB颜色模式保存输出图像,这会消除图像的Alpha通道。因此,在将图像转换为RGB后,您将失去所有的图像不透明度。 - Vasu Deo.S
@VasuDeo.S 我只想在一张照片上添加一些文字。 - Carl H
那么,为什么要使用部分不透明度呢?这只是图像的叠加。你本可以在没有composite()函数的情况下完成它。正如你在问题中提供的链接所示,部分不透明度会使输出图像中的文本具有不同的不透明度,而不是完全没有不透明度的文本。 - Vasu Deo.S
那么我相信你的代码会惨败,因为如果你想在代码中使用部分透明度,那么为什么要将输出文件模式转换为“RGB”呢?这会清除图像的 alpha 通道,所以最终你失去了所有你试图处理的透明度。 - Vasu Deo.S
显示剩余2条评论
1个回答

6

您忘记将输出分配给结果。请更改以下代码

旧的:

result.convert('RGB')

新功能:

result = result.convert('RGB')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接