有一种明显的方法可以做到这一点,我错过了吗?我只是想制作缩略图。
答案 0 :(得分:413)
定义最大尺寸。
然后,通过min(maxwidth/width, maxheight/height)
计算调整大小比率。
正确的尺寸为oldsize*ratio
。
当然还有一种库方法:方法Image.thumbnail
以下是PIL documentation中的(已编辑)示例。
import os, sys
import Image
size = 128, 128
for infile in sys.argv[1:]:
outfile = os.path.splitext(infile)[0] + ".thumbnail"
if infile != outfile:
try:
im = Image.open(infile)
im.thumbnail(size, Image.ANTIALIAS)
im.save(outfile, "JPEG")
except IOError:
print "cannot create thumbnail for '%s'" % infile
答案 1 :(得分:199)
此脚本将使用PIL(Python成像库)调整图像(somepic.jpg)的大小,宽度为300像素,高度与新宽度成比例。它通过确定300像素的原始宽度(img.size [0])然后将原始高度(img.size [1])乘以该百分比来实现。将“basewidth”更改为任何其他数字以更改图像的默认宽度。
from PIL import Image
basewidth = 300
img = Image.open('somepic.jpg')
wpercent = (basewidth/float(img.size[0]))
hsize = int((float(img.size[1])*float(wpercent)))
img = img.resize((basewidth,hsize), Image.ANTIALIAS)
img.save('sompic.jpg')
答案 2 :(得分:54)
我还建议使用PIL的缩略图方法,因为它会消除你的所有比例麻烦。
但有一个重要提示:替换
im.thumbnail(size)
与
im.thumbnail(size,Image.ANTIALIAS)
默认情况下,PIL使用Image.NEAREST过滤器进行大小调整,从而获得良好的性能,但质量很差。
答案 3 :(得分:26)
基于@tomvon,我使用了以下内容:
调整宽度:
new_width = 680
new_height = new_width * height / width
调整身高:
new_height = 680
new_width = new_height * width / height
然后只是:
img = img.resize((new_width, new_height), Image.ANTIALIAS)
答案 4 :(得分:18)
PIL已经可以选择裁剪图像
img = ImageOps.fit(img, size, Image.ANTIALIAS)
答案 5 :(得分:15)
from PIL import Image
img = Image.open('/your iamge path/image.jpg') # image extension *.png,*.jpg
new_width = 200
new_height = 300
img = img.resize((new_width, new_height), Image.ANTIALIAS)
img.save('output image name.png') # format may what u want ,*.png,*jpg,*.gif
答案 6 :(得分:11)
如果您尝试保持相同的宽高比,那么您不会调整原始尺寸的某个百分比吗?
例如,原始尺寸的一半
half = 0.5
out = im.resize( [int(half * s) for s in im.size] )
答案 7 :(得分:4)
我还将添加一个调整大小的版本,以保持宽高比固定。 在这种情况下,它将根据初始宽高比 asp_rat (浮动(!))调整高度以匹配新图像的宽度。 但是,要将宽度调整为高度,您只需要在 else 循环中注释一行,然后取消注释另一行即可。您将在哪里看到。
您不需要分号(;),我保留它们只是为了提醒自己我经常使用的语言的语法。
from PIL import Image
img_path = "filename.png";
img = Image.open(img_path); # puts our image to the buffer of the PIL.Image object
width, height = img.size;
asp_rat = width/height;
# Enter new width (in pixels)
new_width = 50;
# Enter new height (in pixels)
new_height = 54;
new_rat = new_width/new_height;
if (new_rat == asp_rat):
img = img.resize((new_width, new_height), Image.ANTIALIAS);
# adjusts the height to match the width
# NOTE: if you want to adjust the width to the height, instead ->
# uncomment the second line (new_width) and comment the first one (new_height)
else:
new_height = round(new_width / asp_rat);
#new_width = round(new_height * asp_rat);
img = img.resize((new_width, new_height), Image.ANTIALIAS);
# usage: resize((x,y), resample)
# resample filter -> PIL.Image.BILINEAR, PIL.Image.NEAREST (default), PIL.Image.BICUBIC, etc..
# https://pillow.readthedocs.io/en/3.1.x/reference/Image.html#PIL.Image.Image.resize
# Enter the name under which you would like to save the new image
img.save("outputname.png");
然后就完成了。我尽力将其记录在案,因此很明显。
我希望这可能对外面的人有帮助!
答案 8 :(得分:3)
如果您的调整大小限制仅在一维(宽度或高度)上,您可以将 PIL 的 Image.thumbnail
与 sys.maxsize
结合使用。
例如,如果您想调整图像大小使其高度不超过 100 像素,同时保持纵横比,您可以执行以下操作:
import sys
from PIL import Image
image.thumbnail([sys.maxsize, 100], Image.ANTIALIAS)
请记住,Image.thumbnail
将原地调整图像大小,这与 Image.resize
不同,后者返回调整后的图像而不更改原始图像。
答案 9 :(得分:3)
from PIL import Image
from resizeimage import resizeimage
def resize_file(in_file, out_file, size):
with open(in_file) as fd:
image = resizeimage.resize_thumbnail(Image.open(fd), size)
image.save(out_file)
image.close()
resize_file('foo.tif', 'foo_small.jpg', (256, 256))
我使用这个库:
pip install python-resize-image
答案 10 :(得分:2)
保持约束比率并传递最大宽度/高度的简单方法。不是最漂亮,但完成工作并且易于理解:
def resize(img_path, max_px_size, output_folder):
with Image.open(img_path) as img:
width_0, height_0 = img.size
out_f_name = os.path.split(img_path)[-1]
out_f_path = os.path.join(output_folder, out_f_name)
if max((width_0, height_0)) <= max_px_size:
print('writing {} to disk (no change from original)'.format(out_f_path))
img.save(out_f_path)
return
if width_0 > height_0:
wpercent = max_px_size / float(width_0)
hsize = int(float(height_0) * float(wpercent))
img = img.resize((max_px_size, hsize), Image.ANTIALIAS)
print('writing {} to disk'.format(out_f_path))
img.save(out_f_path)
return
if width_0 < height_0:
hpercent = max_px_size / float(height_0)
wsize = int(float(width_0) * float(hpercent))
img = img.resize((max_px_size, wsize), Image.ANTIALIAS)
print('writing {} to disk'.format(out_f_path))
img.save(out_f_path)
return
这是一个python script,它使用此功能来运行批量图像大小调整。
答案 11 :(得分:2)
我正在尝试为幻灯片视频调整一些图像的大小,因此,我不仅想要一个最大尺寸,而且想要一个最大宽度和一个最大高度(视频帧的大小) 。
而且总会有人像录像的可能性...
Image.thumbnail
方法很有希望,但我无法将其放大到较小的图像。
所以在我找不到在这里(或其他地方)执行此操作的明显方法之后,我编写了此函数并将其放在此处以供以后使用:
from PIL import Image
def get_resized_img(img_path, video_size):
img = Image.open(img_path)
width, height = video_size # these are the MAX dimensions
video_ratio = width / height
img_ratio = img.size[0] / img.size[1]
if video_ratio >= 1: # the video is wide
if img_ratio <= video_ratio: # image is not wide enough
width_new = int(height * img_ratio)
size_new = width_new, height
else: # image is wider than video
height_new = int(width / img_ratio)
size_new = width, height_new
else: # the video is tall
if img_ratio >= video_ratio: # image is not tall enough
height_new = int(width / img_ratio)
size_new = width, height_new
else: # image is taller than video
width_new = int(height * img_ratio)
size_new = width_new, height
return img.resize(size_new, resample=Image.LANCZOS)
答案 12 :(得分:2)
已通过“ tomvon”更新了以上答案
from PIL import Image
img = Image.open(image_path)
width, height = img.size[:2]
if height > width:
baseheight = 64
hpercent = (baseheight/float(img.size[1]))
wsize = int((float(img.size[0])*float(hpercent)))
img = img.resize((wsize, baseheight), Image.ANTIALIAS)
img.save('resized.jpg')
else:
basewidth = 64
wpercent = (basewidth/float(img.size[0]))
hsize = int((float(img.size[1])*float(wpercent)))
img = img.resize((basewidth,hsize), Image.ANTIALIAS)
img.save('resized.jpg')
答案 13 :(得分:2)
打开图像文件
from PIL import Image
im = Image.open("image.png")
Use PIL Image.resize(size, resample=0) method,您将图片的(宽度,高度)替换为2元组的大小。
这将以原始尺寸显示图像:
display(im.resize((int(im.size[0]),int(im.size[1])), 0) )
这将以1/2尺寸显示图像:
display(im.resize((int(im.size[0]/2),int(im.size[1]/2)), 0) )
这将以1/3的大小显示图像:
display(im.resize((int(im.size[0]/3),int(im.size[1]/3)), 0) )
这将以1/4的大小显示图像:
display(im.resize((int(im.size[0]/4),int(im.size[1]/4)), 0) )
等
答案 14 :(得分:2)
我丑陋的例子。
函数获取文件如:“pic [0-9a-z]。[extension]”,将它们调整为120x120,将部分移动到中心并保存到“ico [0-9a-z]。[extension]”,适用于肖像和风景:
def imageResize(filepath):
from PIL import Image
file_dir=os.path.split(filepath)
img = Image.open(filepath)
if img.size[0] > img.size[1]:
aspect = img.size[1]/120
new_size = (img.size[0]/aspect, 120)
else:
aspect = img.size[0]/120
new_size = (120, img.size[1]/aspect)
img.resize(new_size).save(file_dir[0]+'/ico'+file_dir[1][3:])
img = Image.open(file_dir[0]+'/ico'+file_dir[1][3:])
if img.size[0] > img.size[1]:
new_img = img.crop( (
(((img.size[0])-120)/2),
0,
120+(((img.size[0])-120)/2),
120
) )
else:
new_img = img.crop( (
0,
(((img.size[1])-120)/2),
120,
120+(((img.size[1])-120)/2)
) )
new_img.save(file_dir[0]+'/ico'+file_dir[1][3:])
答案 15 :(得分:1)
如果您不希望/不需要使用Pillow打开图像,请使用以下方法:
from PIL import Image
new_img_arr = numpy.array(Image.fromarray(img_arr).resize((new_width, new_height), Image.ANTIALIAS))
答案 16 :(得分:0)
只需使用更现代的包装器更新此问题 这个库封装了Pillow(PIL的一个分支) https://pypi.org/project/python-resize-image/
允许你这样做: -
from PIL import Image
from resizeimage import resizeimage
fd_img = open('test-image.jpeg', 'r')
img = Image.open(fd_img)
img = resizeimage.resize_width(img, 200)
img.save('test-image-width.jpeg', img.format)
fd_img.close()
在上面的链接中添加了更多示例。
答案 17 :(得分:0)
我以这种方式调整了图像的大小,并且效果很好
from io import BytesIO
from django.core.files.uploadedfile import InMemoryUploadedFile
import os, sys
from PIL import Image
def imageResize(image):
outputIoStream = BytesIO()
imageTemproaryResized = imageTemproary.resize( (1920,1080), Image.ANTIALIAS)
imageTemproaryResized.save(outputIoStream , format='PNG', quality='10')
outputIoStream.seek(0)
uploadedImage = InMemoryUploadedFile(outputIoStream,'ImageField', "%s.jpg" % image.name.split('.')[0], 'image/jpeg', sys.getsizeof(outputIoStream), None)
## For upload local folder
fs = FileSystemStorage()
filename = fs.save(uploadedImage.name, uploadedImage)
答案 18 :(得分:0)
以下脚本可创建所有JPEG图像的精美缩略图,并保留最大分辨率为128x128的宽高比。
from PIL import Image
img = Image.open("D:\\Pictures\\John.jpg")
img.thumbnail((680,680))
img.save("D:\\Pictures\\John_resize.jpg")
答案 19 :(得分:-1)
import cv2
from skimage import data
import matplotlib.pyplot as plt
from skimage.util import img_as_ubyte
from skimage import io
filename='abc.png'
image=plt.imread(filename)
im=cv2.imread('abc.png')
print(im.shape)
im.resize(300,300)
print(im.shape)
plt.imshow(image)
答案 20 :(得分:-2)
您可以通过以下代码调整图片大小:
From PIL import Image
img=Image.open('Filename.jpg') # paste image in python folder
print(img.size())
new_img=img.resize((400,400))
new_img.save('new_filename.jpg')