PIL - 无法更改JPEG图像的透明度级别

时间:2017-01-01 07:14:15

标签: python python-3.x image-processing python-imaging-library pillow

我正在尝试创建一个图像并用半透明的黑色填充它:

  from PIL import Image
  from PIL import ImageFont
  from PIL import ImageDraw
  from PIL import ImageEnhance


  fnt = create_font()

  # my background rectangle
  img1 = Image.new("RGBA", 100, 100, color=(0, 0, 0, 230)) #RGBA
  dr1 = ImageDraw.Draw(img1)
  dr1.text((5, 5), "some text", font=fnt)

  # my source image
  my_img.paste(dr1, (10, 10))
  my_img.save(out_file, "JPEG")

但它忽略了“230”是透明度水平。如果我将其更改为“0”或任何其他数字,则为“dr1”矩形的透明度级别 保持不变 - 它完全是黑色。

更新

我在jpeg my_img中有一个来源。我想在文本的img1部分放置一个半透明的矩形。我怎样才能做到这一点?如何让img1更透明?

2 个答案:

答案 0 :(得分:3)

首先,JPEG不支持透明度,因此如果您想要一个具有透明度的图像文件,您需要使用不同的格式,例如PNG。

我不知道create_font函数的定义在哪里;在我的PIL ImageFont中没有该名称的功能(我在32位Linux上使用PIL.PILLOW_VERSION ==' 3.3.0'在Python 3.6上)。

此外,粘贴操作无法正常工作,但您并不需要它。

这是您的代码的修改版本。

from PIL import Image, ImageFont, ImageDraw

img1 = Image.new("RGBA", (100, 100), color=(0, 0, 0, 64))
dr1 = ImageDraw.Draw(img1)
fnt = ImageFont.load_default()
dr1.text((5, 5), "some text", font=fnt, fill=(255, 255, 0, 128))

#img1.show()
img1.save('test.png')

这是它创建的PNG文件:

transparent yellow text on a transparent black background

这里有一些代码用于更新您的问题。

from PIL import Image, ImageFont, ImageDraw

img1 = Image.open('hueblock.jpg').convert("RGBA")

overlay = Image.new("RGBA", (100, 100), color=(0, 0, 0, 63))
dr1 = ImageDraw.Draw(overlay)
fnt = ImageFont.load_default()
dr1.text((5, 5), "some text", font=fnt, fill=(255, 255, 255, 160))

img1.paste(overlay, (64, 64), overlay)
img1.show()
img1.save('test.jpg')

以下是 hueblock.jpg test.jpg

hueblock.jpg hueblock with transparent text

请注意粘贴调用的参数:

img1.paste(overlay, (64, 64), overlay)

最后一个参数是图像蒙版。通过提供RGBA图像作为掩码arg,其alpha通道用作掩码,如the Pillow docs中所述

  

[...]如果给出了掩码,则此方法仅更新区域   由面具表示。您可以使用“1”,“L”或“RGBA”图像   (在后一种情况下,alpha波段用作掩模)。哪里的面具   是255,给定的图像按原样复制。掩码为0的地方   当前值保留。中间值会混合两者   图像在一起,包括他们的alpha通道。

答案 1 :(得分:1)

您将图像文件保存为JPEG

JPEG不支持透明度。为了使图像具有透明度,您必须另存为支持图像透明度的格式,例如PNG