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

ako*_*o25 1 python image-processing python-imaging-library python-3.x

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

  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")
Run Code Online (Sandbox Code Playgroud)

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

更新:

我有 jpeg 来源my_img。我想在其带有文本的部分放置一个半透明矩形img1。我怎样才能做到这一点?我怎样才能变得img1更加透明?

PM *_*ing 5

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

\n\n

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

\n\n

另外,该粘贴操作将不起作用,但您不需要它。

\n\n

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

\n\n
from PIL import Image, ImageFont, ImageDraw\n\nimg1 = Image.new("RGBA", (100, 100), color=(0, 0, 0, 64))\ndr1 = ImageDraw.Draw(img1)\nfnt = ImageFont.load_default()\ndr1.text((5, 5), "some text", font=fnt, fill=(255, 255, 0, 128))\n\n#img1.show()\nimg1.save(\'test.png\')\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是它创建的 PNG 文件:

\n\n

透明黑色背景上的透明黄色文本

\n\n
\n\n

这是您更新的问题的一些代码。

\n\n
from PIL import Image, ImageFont, ImageDraw\n\nimg1 = Image.open(\'hueblock.jpg\').convert("RGBA")\n\noverlay = Image.new("RGBA", (100, 100), color=(0, 0, 0, 63))\ndr1 = ImageDraw.Draw(overlay)\nfnt = ImageFont.load_default()\ndr1.text((5, 5), "some text", font=fnt, fill=(255, 255, 255, 160))\n\nimg1.paste(overlay, (64, 64), overlay)\nimg1.show()\nimg1.save(\'test.jpg\')\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是hueblock.jpgtest.jpg

\n\n

色调块.jpg 带有透明文本的色块

\n\n
\n\n

请注意粘贴调用的参数:

\n\n
img1.paste(overlay, (64, 64), overlay)\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
\n

[...] 如果给出了掩码,则此方法仅更新掩码指示的区域。您可以使用 \xe2\x80\x9c1\xe2\x80\x9d、\xe2\x80\x9cL\xe2\x80\x9d 或 \xe2\x80\x9cRGBA\xe2\x80\x9d 图像\n(在后一种情况下) ,alpha 带用作掩模)。如果掩码为 255,则按原样复制给定图像。如果掩码为 0,则保留当前值。中间值会将两个图像混合在一起,包括它们的 Alpha 通道(如果有)。

\n
\n