生成画像のサムネイルあ <10KBかったの本質を見失わないよう割合
-
21-08-2019 - |
質問
予告方法毎に画像がgoogleの指標で小さな サムネイル.これらのサムネイル:
- 以下10KBます。
- の比率の幅と高されているものと同一のものは、元のイメージです。
書きたいと思っている機能(python)、あるいは画像をサムネイルとこれらの物件です。
編集:ない3回答済みのすべて半分です。
いが必要な機能だけでなくリサイズ画像比例したものであることを確ファイルのサイズより小さく10KB.そうい?
解決
そして、effbotショー(および詳細な変動を議論する)あなたがしたいタスクのための優れたアプローチます。
編集:10Kの要件のためとして、それは控えめに言って(難しい;-)今日の圧縮アルゴリズムは非常に微妙なので画像は、画像の形式に応じて、圧縮されているかを予測します。あなたのサムネイルが可能として(ピクセル単位)ちょうど約同じ大きさにしたい場合は、<10K要件を尊重しながら、あなたが到達するまで、スケーリング係数について、順次、より洗練された推測を作る「試行錯誤」のアプローチを使用する必要があります許容できる結果ます。
たとえば、ここに正しいサイズを得るために「バイナリサーチ」アプローチは(もより良い戦略があるかもしれません!)...何が起こっているのかを説明するための十分なprint文&Cで、ですます:
import Image
import cStringIO
import math
import os
import stat
# try no more than 10 times, then give up
MAX_TRIES = 10
def getThumbnail(filename, max_bytes=(10*1024)):
'''Get a thumbnail image of filename, <max_bytes'''
original_size = os.stat(filename)[stat.ST_SIZE]
print "Original file size: %.1f KB" % (original_size/1024.)
image = Image.open(filename)
image.load()
print "Original image size: %dx%d pixels" % image.size
min_bytes = int(0.9 * max_bytes)
largest_side = max(image.size)
smallest_side = 16
for attempt in range(MAX_TRIES):
try_side = (largest_side + smallest_side) / 2
print "Attempt #%d of %d" % (attempt+1, MAX_TRIES)
print "Side must be within [%d:%d], now trying %d" % (
smallest_side, largest_side, try_side)
thumb = image.copy()
thumb.thumbnail((try_side,try_side), Image.ANTIALIAS)
afile = cStringIO.StringIO()
thumb.save(afile, "PNG")
resulting_size = len(afile.getvalue())
afile.close()
print "Reduced file size: %.1f KB" % (resulting_size/1024.)
print "Reduced image size: %dx%d pixels" % thumb.size
if min_bytes <= resulting_size <= max_bytes:
print "Success!"
return thumb
elif resulting_size > max_bytes:
print "Too large (>%d), reducing more" % max_bytes
largest_side = try_side
else:
print "Too small (<%d), reducing less" % min_bytes
smallest_side = try_side
print "too many attempts, returning what I've got!"
return thumb
def main():
thumb = getThumbnail("pyth.png")
print "Reduced image size: %dx%d pixels" % thumb.size
print "Saving to thumb.png"
thumb.save("thumb.png")
thumb_size = os.stat("thumb.png")[stat.ST_SIZE]
print "Reduced file size: %.1f KB" % (thumb_size/1024.)
print "Done, bye!"
if __name__ == '__main__':
main()
他のヒント
あなたは PILのドキュメントを読みましたか? image.thumbnailの方法があります。
利用に呼び出され、サンプルコードはこちらサイズの変更を縦横比
見どのような同様のものづdir
なので、上記のリンクをどのようにサイズ変更画像に呼び出され、今に来てお問の最大サイズの10KBできる容易などの
いサイズの必要は100x100、使用していまJPEG圧縮、100%JPEG品質がすべてアプト式9ビットピクセルを参照 http://en.wikipedia.org/wiki/JPEG)、サイズの100x100るという100x100x9/(1024x8)=11KBで、品質=100までほぼ達成目標が、だいたい10KBのみ設定できます品質=90、一般のとすることができます品質としてparamサイズ変更機能と品質の削減により10%の場合は画像サイズは上記10KBするかという問題はあろうが、必要とせず、90%の品質のすべてのJPEG画像が < 10KB.
また、圧縮なも画像のサイズは30KBのためのRGB画像を小さくすればサイズ60x60ピクセルの画像サイズに合わ10KBずに圧縮ん。e使用できbmp画像をする場合がございますのでおlesses sizerはロスレス圧縮方式を選択できPNG"となります。
その結論という目標10KBは非常に難しい面もあります。