2011-01-20 13 views
2
import Image 

image = Image.open('images/original.jpg') 
width = image.size[0] 
height = image.size[1] 

if width > height: 
    difference = width - height 
    offset  = difference/2 
    resize  = (offset, 0, width - offset, height) 

else: 
    difference = height - width 
    offset  = difference/2 
    resize  = (0, offset, width, height - offset) 

thumb = image.crop(resize).resize((200, 200), Image.ANTIALIAS) 
thumb.save('thumb.jpg') 

これは私の現在のサムネイル生成スクリプトです。それが動作する方法は次のとおりです。画像の幅/高さを指定されたアスペクト比に合わせて縮小します。どうやって? - Python画像のサムネイル

イメージが400x300で、100x100のサムネイルが必要な場合は、元のイメージの左右から50ピクセル離れます。したがって、300x300にサイズ変更してください。これにより元の画像は新しいサムネイルと同じアスペクト比になります。その後、必要なサムネイルサイズに縮小します。

これの利点は次のとおりです。サムネイルが画像の中心から取られ

  • あなたは400×300に縮小した場合
  • アスペクト比は

をめちゃくちゃにされません。画像を100x100にすると、潰れて見えます。 0x0座標からサムネイルを取得した場合、画像の左上が取得されます。通常、画像の焦点は中心である。

私ができることを望むのは、スクリプトに任意のアスペクト比の幅/高さを与えることです。たとえば、400x300の画像を400x100にサイズ変更したい場合は、画像の左右に150pxを削ってください。

私はこれを行う方法は考えられません。何か案は?

+0

あなたと(彼の答えの@マークロングエア)は画像のサイズ変更を呼び出すと、より一般的には*クロッピング*と呼ばれます。サイズ変更は、通常、一方または両方の寸法を拡大縮小することを意味します。 – martineau

+0

@martineau:まあ、彼は切り取ってからサイズを変更しています。質問との一貫性のために変数名を 'cropize'の呼び出しで' resize'として保存しました... –

+0

元の画像をサムネイルの境界線の一部に収まるのではなく、サムネイルの境界線に収まります。これにより、サムネイルの矩形内に未使用のスペースが残ることがありますが、元の部分は削除されません。これは、アスペクト比を比較して、適切なスケール係数(サムネイルの対応する寸法(幅または高さ)内に収まるように最長寸法をスケーリングするもの)を比較することによって行うことができる。 – martineau

答えて

7

あなたはアスペクト比を比較する必要があります。アスペクト比はどちらが大きいかに応じて、辺または上下を切り落とすかどうかを判断するだけです。例えば方法について:

import Image 

image = Image.open('images/original.jpg') 
width = image.size[0] 
height = image.size[1] 

aspect = width/float(height) 

ideal_width = 200 
ideal_height = 200 

ideal_aspect = ideal_width/float(ideal_height) 

if aspect > ideal_aspect: 
    # Then crop the left and right edges: 
    new_width = int(ideal_aspect * height) 
    offset = (width - new_width)/2 
    resize = (offset, 0, width - offset, height) 
else: 
    # ... crop the top and bottom: 
    new_height = int(width/ideal_aspect) 
    offset = (height - new_height)/2 
    resize = (0, offset, width, height - offset) 

thumb = image.crop(resize).resize((ideal_width, ideal_height), Image.ANTIALIAS) 
thumb.save('thumb.jpg') 
+0

これは素晴らしいです。乾杯! – dave

+0

@greg:問題ありません。答えを受け入れることができればいいと思います。その場合:) –

関連する問題