2012-02-04 13 views
5

SOにはいくつかの類似の質問がありますが、本当に助けられたものはありません。基本的に私はここに見られるように、シンプルなPNG画像のサイズを変更しようとしています:Pythonイメージライブラリとハロー効果による透明なPNGサイズ変更

http://media.spiralknights.com/wiki-images/3/3e/Equipment-Proto_Sword_icon.png

私はPHPでこれらのイメージを使用するユーティリティを実装し、もともとあった(MMOスパイラル騎士、著作権スリーリング・エンターテイメントから)、そこでのリサイズユーティリティは完璧に機能しました。 PHPのドキュメンテーションのimagecopyresampledページに記載されている方法を使用しました。

正直なところ私はPhotoshopでサイズを変更することさえできませんが、結果はPythonではほとんど悲惨です。私は一貫してハロー効果を得て、これは少なくとも部分的に透過ピクセルの実際のRGBA値と考えています。ここで、この絵は良いことを伝えます:resize examples

(最後のサイズ変更に二

は、最初に二回、最終的な大きさのサイズを変更するには、私は別のフォーラムで見ただけの提案であり、それは助けには、少なくとも少しDID、十分ではありません)

画像のサイズを変更すると、画像はすでにRGBAモードになっています。

ご覧のとおり、PHPとPhotoshopのサイズ変更にはハローフリーです。正直なところ、PHPのサイズ変更以外のすべては、あまりにも機能しますが、私はPHPイメージの最小限のパレットが好きです(より大きなバージョンを見ると、PHPリサイズの色の差は小さく見えます)。しかし、Photoshopそれをサイズ変更したか、またはPython内部のサイズを変更しても、ハローは受け入れられません。

PHPとPhotoshopは、補間時にアルファチャンネルのピクセルの色を使わないことを知っているようですが、Pythonはその明るい枠線を使用していますが、それ以外の場合は透明になります。

残念ながら、さまざまなプロファイルを使用してサイズを変更する必要があるアイコンがたくさんあるため、この円形のものほど単純ではありませんが、これは実験中に最初に使用したものです。

それは、それ自体のコードの問題の多くはないのですが、あなたは、このを見て何かが必要な場合は要旨次のとおりです。最終的な質問ビーイング

>> import Image 
>> img = Image.open('swordorig.png') 
>> img 
<PngImagePlugin.PngImageFile image mode=RGBA size=256x256 at 0x2A3AF58> 
>> img.resize((36,36), Image.ANTIALIAS).save('swordresize.png') 

:PILをしないように指示する方法がありますリサンプリング中にアルファが0のピクセルの色を使用しますか?

+0

PILを知らないが、RGBa(RGBAではない)を使用して、画像を事前に乗算されたアルファであると見なすように指示しましたか? – rotoglup

+1

私はなかったので、提案に感謝!残念ながら、PILはRGBaをpngとして書くことができないようです。 "IOError:PNG形式のRGBaを書き込めません" – cogs

+0

Photoshop Bicubicの結果が好きなら、おそらく 'Image.BICUBIC'または' Image.NEAREST'が良いでしょうか? http://pastebin.com/VRBKWZUh – reclosedev

答えて

6

お返事いただきありがとうございます。そして、私が実際に探していたものの言葉を私に伝えるために、特にロータリーアップに。 PILの事前乗算されたアルファのスタックオーバーフローページを調べると、うまくいくソリューションが見つかりました。

resize sheet 2

グレーのバーがちょうど彼らが明るい背景にどのように見えるかの印象を与えるために、次のとおりです。ここでは、サイズ変更、グラフィックの更新シートです。

https://stackoverflow.com/a/6882161/1189554

をmadlagのおかげで、だから私のコードは次のように見て終わる:

>> import Image, numpy 
>> img = Image.open('swordorig.png') 
>> premult = numpy.fromstring(img.tostring(), dtype=numpy.uint8) 
>> alphaLayer = premult[3::4]/255.0 
>> premult[::4] *= alphaLayer 
>> premult[1::4] *= alphaLayer 
>> premult[2::4] *= alphaLayer 
>> img = Image.fromstring("RGBA", img.size, premult.tostring()) 
>> img.resize((36,36), Image.ANTIALIAS).save('swordresize.png') 

そして、あなたは、シートの下部にあるアイコンを取得します。 PHPのバージョンよりもさらに多くの色、そして非常に軽いリングですが、全体的にははるかに良い。私はそれをさらに改善するためにアルゴリズムを微調整できると確信しています。返信いただきありがとうございました!

関連する問題