我有一个字符串,其中包含图像的base64代码。我需要将此图像的大小调整为591x608px,但如果它具有不同的比例,我不希望它变形。
我不知道这是不是最好的方法(如果有更好的方法,请纠正我),但我正试图通过PIL库为图像添加一个591x608px的矩形。
我尝试使用图像文件执行此操作并且它有效,因此我尝试使用base64字符串而不是文件名重复此过程。但我没有达到目的。
from cStringIO import StringIO
from PIL import Image, ImageOps, ImageDraw
size = (591, 608)
mask = Image.new('L', size, 0)
draw = ImageDraw.Draw(mask)
draw.rectangle((0, 0) + size, fill=255)
# From base64 to PIL
image_string = StringIO(my_image.decode('base64'))
im = Image.open(image_string)
output = ImageOps.fit(im, mask.size, centering=(0.5, 0.5))
output.putalpha(mask)
# From PIL to base64?
output = base64.b64encode(output)
这是我多次失败的尝试之一。它给了我一个错误:
output = base64.b64encode(output)
TypeError: must be string or buffer, not instance
有人可以帮助我吗?
答案 0 :(得分:0)
最后,我找到了解决方案。
这实际上并没有添加透明区域(因此我会编辑问题的标题),但它会将图像调整到指定的比例尺,从而切割图像的多余部分必要的:
from cStringIO import StringIO
from PIL import Image, ImageOps, ImageDraw
size = (591, 608)
mask = Image.new('L', size, 0)
draw = ImageDraw.Draw(mask)
draw.rectangle((0, 0) + size, fill=255)
# From base64 to PIL
image_string = StringIO(my_image.decode('base64'))
im = Image.open(image_string)
output = ImageOps.fit(im, mask.size, centering=(0.5, 0.5))
output.putalpha(mask)
# From PIL to base64
output2 = StringIO()
output.save(output2, format='PNG')
im_data = output2.getvalue()
im_data = im_data.encode('base64')
# data_url = 'data:image/png;base64,' + im_data.encode('base64')
请注意,如果您打印 im_data ,您将看到奇怪的符号(在我的情况下,我将此字符串发送到URL并起作用)。如果你想看到没有奇怪符号的 im_data ,请取消注释最后一行。