我正试图在GAE上的图像上叠加一些文字。现在他们暴露了PIL库它不应该是问题。
这就是我所拥有的。它有效,但我不禁想到我应该直接写入背景图像,而不是创建一个单独的叠加图像然后合并。
我可以使用Image.frombuffer或其他东西吗,我已经给它一个但是我只是没有得到它......
from PIL import Image, ImageDraw, ImageFont
from google.appengine.api import images
from google.appengine.ext import blobstore
from google.appengine.api import files
def compose(key):
# create new image
text_img = Image.new('RGBA', (800,600), (0, 0, 0, 0))
draw = ImageDraw.Draw(text_img)
draw.text((0, 0), 'HELLO TEXT', font=ImageFont.load_default())
# no write access on GAE
output = StringIO.StringIO()
text_img.save(output, format="png")
text_layer = output.getvalue()
output.close()
# read background image
blob_reader = blobstore.BlobReader(key)
background = images.Image(blob_reader.read())
# merge
merged = images.composite([(background, 0, 0, 1.0, images.TOP_LEFT),
(text_layer, 0, 0, 1.0, images.TOP_LEFT)],
800, 600)
# save
file_name = files.blobstore.create(mime_type='image/png')
with files.open(file_name, 'a') as f:
f.write(merged)
files.finalize(file_name)
答案 0 :(得分:2)
您应该使用[Image.open][1]
方法。 Image.frombuffer
和Image.fromstring
解码像素数据而非原始图像。
在你的情况下,你可以使用类似的东西:
blob_reader = blobstore.BlobReader(key)
text_img = Image.open(blob_reader)
.........
答案 1 :(得分:2)
您需要使用PIL打开图像,而不是应用引擎图片类型(另一个答案是由一个字符关闭:Image
,而不是Images
):
blob_reader = blobstore.BlobReader(key)
text_img = Image.open(blob_reader)
答案 2 :(得分:0)
直接在背景图像上绘制将是最直接的:
draw = ImageDraw.Draw(background)
draw.text((0, 0), 'HELLO TEXT', font=ImageFont.load_default())