555

私が見逃しているこれを行う明白な方法はありますか?私はちょうどサムネイルを作ろうとしています。

4

23 に答える 23

570

最大サイズを定義します。次に、 を使用してサイズ変更率を計算しmin(maxwidth/width, maxheight/height)ます。

適正サイズはoldsize*ratio.

もちろん、これを行うためのライブラリメソッドもあります: method Image.thumbnail. 以下は、 PIL ドキュメント
の (編集された) 例です。

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
于 2008-11-07T23:15:37.973 に答える
345

このスクリプトは、PIL(Python Imaging Library)を使用して画像(somepic.jpg)のサイズを300ピクセルの幅に変更し、高さは新しい幅に比例します。これは、元の幅(img.size [0])の300ピクセルのパーセンテージを決定し、元の高さ(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('somepic.jpg')
于 2009-01-16T19:12:07.400 に答える
77

また、PIL のサムネイル方式を使用することをお勧めします。比率の問題がすべて解消されるからです。

ただし、重要なヒントが 1 つあります。

im.thumbnail(size)

im.thumbnail(size,Image.ANTIALIAS)

デフォルトでは、PIL はサイズ変更に Image.NEAREST フィルターを使用します。これにより、パフォーマンスは向上しますが、品質は低下します。

于 2009-06-02T16:03:07.700 に答える
63

@tomvonに基づいて、次の使用を終了しました(ケースを選択してください):

a)高さのサイズ変更(新しい幅はわかっているので、新しい高さが必要です)

new_width  = 680
new_height = new_width * height / width 

b)幅のサイズ変更新しい高さを知っているので、新しい幅が必要です

new_height = 680
new_width  = new_height * width / height

それからちょうど:

img = img.resize((new_width, new_height), Image.ANTIALIAS)
于 2015-05-14T00:37:06.567 に答える
27

同じ縦横比を維持しようとしている場合は、元のサイズの何パーセントかだけサイズを変更しませんか?

たとえば、元のサイズの半分

half = 0.5
out = im.resize( [int(half * s) for s in im.size] )
于 2008-12-13T03:43:00.460 に答える
20
from PIL import Image

img = Image.open('/your image 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 you want *.png, *jpg, *.gif
于 2016-03-16T13:17:46.763 に答える
7
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
于 2015-09-27T10:02:19.773 に答える
4

サイズ変更の制限が 1 つのディメンション (幅または高さ) のみである場合は、PILImage.thumbnailを組み合わせることができます。sys.maxsize

たとえば、縦横比を維持したまま高さが 100px を超えないように画像のサイズを変更する場合は、次のようにします。

import sys
from PIL import Image

image.thumbnail([sys.maxsize, 100], Image.ANTIALIAS)

はその場で画像のサイズを変更することに注意してください。これは、元の画像を変更せずにサイズ変更された画像を返すのImage.thumbnailとは異なります。Image.resize

于 2021-01-26T15:40:58.000 に答える
3

制約された比率を維持し、最大幅/高さを渡すための簡単な方法。最もきれいではありませんが、仕事を成し遂げ、理解しやすいです:

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 スクリプトを次に示します。

于 2018-05-31T06:40:10.380 に答える
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:])
于 2013-05-22T10:48:36.163 に答える
0
######get resize coordinate after resize the image using this function#####
def scale_img_pixel(points,original_dim,resize_dim):
        multi_list = [points]
        new_point_list = []
        multi_list_point = []
        for point in multi_list:
            multi_list_point.append([point[0],point[1]])
            multi_list_point.append([point[2],point[3]])
        for lsingle_point in multi_list_point:
            x1 = int((lsingle_point[0] * (resize_dim[0] / original_dim[0])))
            y1 = int((lsingle_point[1] * (resize_dim[1] / original_dim[1])))
            new_point_list.append(x1)
            new_point_list.append(y1)
            
        return new_point_list
    
    
    points = [774,265,909,409]
    original_dim = (1237,1036)
    resize_dim = (640,480)
    result = scale_img_pixel(points,original_dim,resize_dim)
    print("result: ", result)  
于 2022-01-15T07:00:10.450 に答える
-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)
于 2020-08-03T05:48:56.263 に答える