3

PILで画像を適切にダウンサンプリングしようとして問題が発生しました。この場合の目標は、異なるサイズが必要な場合はいつでも、私のWebサイトが自動的に元の画像ファイルをダウンサンプリング->キャッシュすることです。これにより、同じ画像の複数のバージョンを維持する手間を省くことができます。しかし、私は運がありませんでした。私はもう試した:

image.thumbnail((width, height), Image.ANTIALIAS)
image.save(newSource)

image.resize((width, height), Image.ANTIALIAS).save(newSource)

ImageOps.fit(image, (width, height), Image.ANTIALIAS, (0, 0)).save(newSource)

そして、それらはすべて、ピクセル全体を平均化するのではなく、最も近いダウンサンプルを実行しているように見えます。したがって、次のような画像になります。

http://www.techcreation.sg/media/projects//software/Java%20Games/images/Tanks3D%20Full.png

http://www.techcreation.sg/media/temp/0x5780b20fe2fd0ed/Tanks3D.png

これはあまり良くありません。他の誰かがこの問題にぶつかったことがありますか?

4

2 に答える 2

5

その画像は、インデックスカラー(パレットまたはPモード)の画像です。使用できる色の数は非常に限られており、サイズ変更された画像のピクセルがパレットに表示される可能性はほとんどありません。これは、中間の色が多数必要になるためです。したがって、サイズ変更時には常に最近傍モードを使用します。それは本当に同じパレットを維持する唯一の方法です。

この動作は、AdobePhotoshopの場合と同じです。

必要に応じて、最初にRGBモードに変換してサイズを変更してから、保存する前にパレットモードに戻ります。(実際には、RGBモードで保存してから、サイズ変更された画像のフォルダーでPNGCrushを緩めます。)

于 2011-10-29T00:36:13.603 に答える
4

これは1年以上前のものですが、誰かがまだ探している場合に備えて:

これは、画像がパレットモードであるかどうかを確認し、調整を行うコードのサンプルです。

 import Image # or from PIL import Image
 img = Image.open(sourceFile)
 if 'P' in img.mode: # check if image is a palette type
     img = img.convert("RGB") # convert it to RGB
     img = img.resize((w,h),Image.ANTIALIAS) # resize it
     img = img.convert("P",dither=Image.NONE, palette=Image.ADAPTIVE) 
           #convert back to palette
 else:
     img = img.resize((w,h),Image.ANTIALIAS) # regular resize
 img.save(newSourceFile) # save the image to the new source
 #img.save(newSourceFile, quality = 95, dpi=(72,72), optimize = True) 
    # set quality, dpi , and shrink size

パレットバージョンをRGBに変換することで、アンチエイリアスを使用してサイズを変更できます。再変換する場合は、ディザリングをNONEに設定し、ADAPTIVEパレットを使用する必要があります。オプションが含まれていない場合(パレットに再変換された場合)、結果は粗くなります。また、一部の画像形式では、保存機能の品質オプションを使用して、品質をさらに向上させることができます。

于 2012-11-03T19:31:04.847 に答える