如何调整图像大小并在Python中删除多余的区域?

时间:2015-02-11 16:40:53

标签: python python-2.7 base64 decode encode

我有一个字符串,其中包含图像的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

有人可以帮助我吗?

1 个答案:

答案 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 ,请取消注释最后一行。