2017-07-11 5 views
1

私たちのデータベースがsvg形式のプロジェクトで作業しています。奇妙なこと(私は画像フォーマットについてあまり知らない)は、画像ビューア、ImageMagick、Pintaなどのコンピュータプログラムで画像を開くと画像が全く違って見えるということです。ブラウザ(MozillaまたはChrome)私は画像を(svgからpngに変換して)便宜のために付けています。普通のプログラムと比較してブラウザで開くと、その差が本当に大きいことが分かります。SVG/PNGファイルがブラウザで別に開きます

The image

今、私は何が起こっているかを見るためにはPythonでそれを開いた、と明らかに画像がRBGAフォーマットです。私はそれをRGBに変換すると思って、次のコードを使ってそれをしました:

img = Image.open(os.path.join(PNG_REPO, page)[:-4] + ".png") 
arr = np.array(img) 
rgbImage = cv2.cvtColor(arr, cv2.COLOR_RGBA2RGB) 
img = Image.fromarray(rgbImage) 
img.save("please.png") 

そして、変わったことが起こりました。画像は完全に黒くなっているようです(下に添付)、Python上で開くと、ローカルプログラムやブラウザはそれ以上の違いはありません。

enter image description here

誰もが何が起こっている任意のアイデアを持っていますか?私はそれを失っていると思うし、私は完全に固執されています。

答えて

1

実際、SVGとPNGは全く異なっています。

SVG(スケーラブルベクターグラフィックス)は標準画像フォーマットではありません。画像はピクセル(または派生)のレイとして保存されるのではなく、ベクター化されたフォーマットとして保存されます。表示するには、ベクトルをピクセルにレンダリングしてから表示する必要があります。このアプローチの大きな資産は、品質対サイズです。イラストでは、サイズはほとんど変わらない素晴らしい品質を持つことができますが、処理に時間がかかり、デコードは他の画像フォーマットと大きく異なります。画像ビューアではサポートされていないことが多く、レンダラのビットに依存します。

一方、PNG(Portable network graphics)はまだピクセルに基づいており、非常に幅広くサポートされています。

あなたの質問には、画像にはアルファ(透明)チャンネルがあります。これをRGBに変換すると、この透明性がなくなります。これはopencvが固定カラーに変換します。ここでは、この色は(0,0,0)、つまり黒です。

img = Image.open(os.path.join(PNG_REPO, page)[:-4] + ".png") 
img.load() 
new_img = Image.new("RGB", img.size, (255, 255, 255)) 
new_img.paste(img, mask=img.split()[3]) # 3 is the alpha channel 
new_img.save("should_be_good.png") 
+0

をそして実際、それは良いです:

あなたはこれを試してみてください。 (もちろん、3行目と4行目にpngの代わりにimgが必要です)。 私はSVGとPNGがまったく異なるフォーマットであることを知っていますが、私は1から他への変換(私はcairosvgを使用しました)は問題ないと思いました。そして、もし私がそれを行い、あなたのコードを進めるならば、PNGファイルはSVGファイルと非常によく似ています。 – TheRevanchist

+0

私は自分のコードを修正しました、ごめんなさい!それが助けになることを知っておくとよい。あなたの変換は良いと思われました。それはopenCVが透明性をかなり悪く扱うことです(つまり、別の背景色を持つ選択肢を残さないという意味です)。 –

+0

ありがとう!私はこれをしようと2時間過ごした。 関連するノートでは、ヘッダーとフッターをミュージカル・シアーから取り除く最も簡単な方法は何でしょうか? – TheRevanchist

関連する問題