2017-01-10 8 views
2

* EDIT * ありません、私は(実際には透明透明ビットで。)ただ単にPNGをロードし、Tkのキャンバスに、それをレンダリングする.BMP を変換しようとしていないのですPython 3.5 + PillowではRGBA PNGがサポートされていませんか?

目標: 何透明性とPNGファイルをロードしてのpython3(およびPILのサポートのための枕を使用)とのTkinterのキャンバス

問題でそれらをレンダリングする: をRGBAとしてロードされると、彼らはキャンバスに描画するのに失敗します。それらをRGBに変換するとレンダリングされますが、もちろん透明性はありません。

環境: マックOSX、Pythonの3.5がインストールされ、枕は

ノート 3.5のパスにある検証: CuriosityRover.pngは確かにRGBA、print文を確認し、ファインダーで確認しています灰色の背景とPhotoshopの透明性を備えたWebを保存しています。

私はこのような単なるアルファ層を抽出しようとしている

alpha = img.convert('RGBA').split()[-1] 

呼び出すalpha.showは()実際にプレビューでアルファ層を私に示していますが、それは、キャンバスウィジェットでレンダリングするために失敗しました。

私が作成しようとしているIもImageOps.invert(アルファ) 用いアルファ層を反転しようとした(反転を適用した後(.SHOW呼び出しを介して、確認済み)を、私はプレビューで逆アルファ層を参照。)

transparent_area =(0、0、300、300) マスク= Image.new( 'L'、curosity.size、color = 255) 描画= ImageDraw.Draw(マスク) draw.rectangle (transparent_area、fill = 0) img.putalpha(mask)

そして、は透明な矩形領域を作成するため、canvas.create_image が透明で問題なく動作しているようですが、何らかの形で透明度データが正しいPhotoImageを作成できません。

私は非常に多くのスタックオーバーフロータブを持っていますが、私はこれを理解できないほど恥ずかしく思っています。

これは世界で最も単純なもののようです。私は間違って何をしていますか?

import tkinter as tk 
from PIL import Image, ImageTk 

img = Image.open("./Assets/CuriosityRover.png") 
img2 = Image.open("./Assets/CuriosityRover.png").convert('RGB') 

img.show() # Shows the image just fine in preview 
print(img.format, img.size, img.mode) 

root = tk.Tk() 
photo = ImageTk.PhotoImage(img) # img fails render, img2 works but no alpha 

canvas = tk.Canvas(root, width=600, height=600, bg="black") 

canvas.create_image((300, 300), image=photo) 
canvas.grid(row=0, column=0) 

root.mainloop() 
+0

[PILとロードRGBAビットマップ]の可能な重複(http://stackoverflow.com/questions/10453604/load-rgba-bitmap-with-pil) –

+0

いいえ、私はロードしないのです.BMP、私はPNGをロードしています –

+0

"レンダリングに失敗しました"とはどういう意味ですか?エラーメッセージが表示されますか?私はそれがLinux上で動作するとしか言えないので、問題はMac上でしかない。ところで:あなたは1つの画像だけで試しましたか? – furas

答えて

4

Woot!私はこれを解決した。

TL; DR - YES RGBA * PNG画像は、、サポートされていない枕/ Tkinkerで - しかし仕事はおよそ以下であり、値を持つアルファチャンネルを強制のみ0又は

255チャンネルは、任意の値を持つことができません* 0または255以外の場合は、画像全体が描画されません(アルファチャンネルに255のピクセルさえも)。)

より長いバージョン: それは私からひどいものを盗んでいました。私の問題は、Photoshopが8ビットの情報でAlphaチャンネルを節約するため、私のテスト画像には目に見えない範囲の微妙な透明画があることがわかりました。彼らは、私が画像を見たときに不透明または透明に見えました。

しかし、実際のバイトを比較すると、矩形透明度のテストケースの成功例の後に、Imageは透明の場合は0、不透明の場合は255が必要です(TkinterはGUIを動的にレイアウトするため、 )部分的な透明性の場合、下のピクセルの色は何ですか。

これを修正するために、以下で作成したヘルパー関数を使用してイメージを実行します。これは、8ビットの情報を反転させます。アルファチャンネルを強制的に0または255のいずれかにします。50以下の場合は透明と見なすことをやや恣意的に選択しました。

うまくいえば、これを最初から見つけ出す前に、誰かがこれを見るといいと思います。

# Fixes the issue when trying to render RBGAs that have 8bits of information in the alpha channel 
# Turns your image into 8 bits on RGB and then 1 bit on the A channel 
# This will render correctly 
# See the example below for how to use 

from PIL import Image 


def flattenAlpha(img): 
    alpha = img.split()[-1] # Pull off the alpha layer 
    ab = alpha.tobytes() # Original 8-bit alpha 

    checked = [] # Create a new array to store the cleaned up alpha layer bytes 

    # Walk through all pixels and set them either to 0 for transparent or 255 for opaque fancy pants 
    transparent = 50 # change to suit your tolerance for what is and is not transparent 

    p = 0 
    for pixel in range(0, len(ab)): 
     if ab[pixel] < transparent: 
      checked.append(0) # Transparent 
     else: 
      checked.append(255) # Opaque 
     p += 1 

    mask = Image.frombytes('L', img.size, bytes(checked)) 

    img.putalpha(mask) 

    return img 

# Run this as a test case. 
# Assumes that you have a PNG named "CuriosityRover.png" 
# that is an RGBA with varying levels of Alpha in the 
# subdirectory assets from your working directory 

if __name__ == "__main__": 
    from PIL import ImageTk 
    import tkinter as tk 

    img = Image.open("./Assets/CuriosityRover.png") 

    img = flattenAlpha(img) 
    root = tk.Tk() 

    photo = ImageTk.PhotoImage(img) 
    canvas = tk.Canvas(root, width=600, height=600, bg="red") 

    canvas.create_image((300, 300), image=photo) 
    canvas.grid(row=0, column=0) 

    root.mainloop() 
+0

あなたの結論は間違っているかもしれないと思いますが、後でそれを検証する必要があります。 –

+0

私は間違っているとうれしいです。たくさんのテストが仮説をサポートしているようです。 –

+0

ヘルパー機能は本当にうまく機能します。私は、GIMPによって作成された透明なPNGで、ヘルパー機能の修正によって表示されずに実行されているのと全く同じ問題を抱えていました。 –

関連する問題