如何在Python中调整图片大小并裁掉多余的区域?
How to resize an image an cut the excess area of it in Python?
我有一个包含图像 base64 代码的字符串。我需要将此图片调整为 591x608 像素,但我不希望它在不同比例下变形。
我不知道这是不是最好的方法(如果有更好的请指正),但我正在尝试通过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
有人能帮帮我吗?
终于找到解决方法了
这实际上并不是在添加透明区域(所以我将编辑问题的标题),而是将图像调整为指定的比例,必要时剪切图像的多余部分:
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 没有奇怪的符号,取消注释最后一行。
我有一个包含图像 base64 代码的字符串。我需要将此图片调整为 591x608 像素,但我不希望它在不同比例下变形。
我不知道这是不是最好的方法(如果有更好的请指正),但我正在尝试通过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
有人能帮帮我吗?
终于找到解决方法了
这实际上并不是在添加透明区域(所以我将编辑问题的标题),而是将图像调整为指定的比例,必要时剪切图像的多余部分:
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 没有奇怪的符号,取消注释最后一行。