C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: BMPファイルをBgra32形式で読み込みたい


(過去ログ 101 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■60072 / inTopicNo.1)  BMPファイルをBgra32形式で読み込みたい
  
□投稿者/ K (1回)-(2011/06/18(Sat) 16:56:48)

分類:[.NET 全般] 

環境 Windows XP SP3, Visual studio 2008
WPFです。

Alpha情報有りのBMPファイル(V4フォーマット)を、Bgra32形式で読み込みたいです。
BitmapDecoder.Create()やBitmapFrame.Create()で読み込むと、なぜかBgr32になってしまいます。

BitmapDecoder decoder = BitmapDecoder.Create(stream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.OnLoad);
BitmapSource bitmap = decoder.Frames[0];

何かよい方法がありますでしょうか?
BitmapCreateOptionsをPreservePixelFormatにしてみましたが、やはりBgr32になってしまいます。
FormatConvertedBitmapで無理やりBgra32に変換しても、Alpha情報が失われてしまいます。

現状、ファイルを直接読み込み、BitmapSource.Create()で生成すれば、Alpha情報を持ったままBgra32で読み込めることがわかっています。
ただ、すべてのBMPを自力で解析して読み込むのは大変なので、なんとか標準のWICデコーダを使えないか検討しています。

よろしくお願いします。

引用返信 編集キー/
■60094 / inTopicNo.2)  Re[1]: BMPファイルをBgra32形式で読み込みたい
□投稿者/ とっちゃん (584回)-(2011/06/20(Mon) 13:56:05)
とっちゃん さんの Web サイト
No60072 (K さん) に返信

> Alpha情報有りのBMPファイル(V4フォーマット)を、Bgra32形式で読み込みたいです。
> BitmapDecoder.Create()やBitmapFrame.Create()で読み込むと、なぜかBgr32になってしまいます。
>
V4フォーマットのファイルは一般には流通していないと思っていたのですが。。。そうではないんですね。


> BitmapDecoder decoder = BitmapDecoder.Create(stream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.OnLoad);
> BitmapSource bitmap = decoder.Frames[0];
>
ピクセル情報以外は問題なく読み取れているのでしょうか?
また、WICを使った場合最上位の8ビットはクリアされていたりするのでしょうか?

> ただ、すべてのBMPを自力で解析して読み込むのは大変なので、なんとか標準のWICデコーダを使えないか検討しています。
>
単純にWICのデコーダーがV4フォーマットに完全対応していないか、そもそも参照しているV4フォーマットのヘッダーに
問題があってAlpha情報が消えてしまっているかのどちらかだろうと思います。

前者だとしたら、別途デコーダーを用意してそっちを使うようにする(標準のフォーマットのデコーダーを差し替えられるかは不明)
という方向で検討するのがいいでしょう。

後者であれば、間違っているので読めないのが正しいとなりますので、そのV4フォーマットのビットマップにエンコードした
エンジンを修正するということになると思います。

個人的には、V4フォーマットの画像ファイルはまだ見たことがないので、ヘッダーの内容を見て正しいかどうかを
判断することができるかどうかもわかりませんけどw

引用返信 編集キー/
■60148 / inTopicNo.3)  Re[2]: BMPファイルをBgra32形式で読み込みたい
□投稿者/ K (2回)-(2011/06/22(Wed) 00:07:36)
> V4フォーマットのファイルは一般には流通していないと思っていたのですが。。。そうではないんですね。

私もあまり見たことがないです。使わないんですかね。。。

> ピクセル情報以外は問題なく読み取れているのでしょうか?
> また、WICを使った場合最上位の8ビットはクリアされていたりするのでしょうか?

最上位8ビット以外はちゃんと読めてます。
ただ、透けて欲しい部分が透けてくれません。
CopyPixelで読み出すと、最上位バイトが0になってます。

>そもそも参照しているV4フォーマットのヘッダーに
> 問題があってAlpha情報が消えてしまっているかのどちらかだろうと思います。

その可能性も考えました。
ネットで見つけたV4フォーマットのデータや、ツールで生成したファイルを片っ端から読み込ませてみましたが、ダメでした。

> 個人的には、V4フォーマットの画像ファイルはまだ見たことがないので、ヘッダーの内容を見て正しいかどうかを
> 判断することができるかどうかもわかりませんけどw

MSDNにあまり情報がないんで、あまり自信がないです。
特に、v4の時、12バイトのカラーマスクがヘッダの後ろに必要なのかどうかとか。

引用返信 編集キー/
■60152 / inTopicNo.4)  Re[3]: BMPファイルをBgra32形式で読み込みたい
□投稿者/ とっちゃん (585回)-(2011/06/22(Wed) 01:54:49)
とっちゃん さんの Web サイト
No60148 (K さん) に返信
>>V4フォーマットのファイルは一般には流通していないと思っていたのですが。。。そうではないんですね。
>
> 私もあまり見たことがないです。使わないんですかね。。。
>
V4フォーマットは圧縮フォーマットじゃないので、アルファプレーンを使うならPNGを使うのが一般的だと思います。
もっともBMPをそのまま使ってということそのものが減ってると思いますが。。。

>>ピクセル情報以外は問題なく読み取れているのでしょうか?
>>また、WICを使った場合最上位の8ビットはクリアされていたりするのでしょうか?
>
> 最上位8ビット以外はちゃんと読めてます。
> ただ、透けて欲しい部分が透けてくれません。
> CopyPixelで読み出すと、最上位バイトが0になってます。
>
CopyPixelは、PixelFormat見てしまう気がするんですが。。。直接メモリイメージを参照してみないとわからない気がします。


> その可能性も考えました。
> ネットで見つけたV4フォーマットのデータや、ツールで生成したファイルを片っ端から読み込ませてみましたが、ダメでした。
>
とすると、WICが対応していない可能性が非常に高いですね。
そもそもWICでV4フォーマットにエクスポートはできるのでしょうか?

もし、エクスポートできるのなら、PNGで透過のある画像を読み込んで、そいつをV4フォーマットでエクスポートして
そのエクスポートされたビットイメージを見れば何かつかめるのではないかと。。。


>>個人的には、V4フォーマットの画像ファイルはまだ見たことがないので、ヘッダーの内容を見て正しいかどうかを
>>判断することができるかどうかもわかりませんけどw
>
> MSDNにあまり情報がないんで、あまり自信がないです。
> 特に、v4の時、12バイトのカラーマスクがヘッダの後ろに必要なのかどうかとか。
>
12バイト?
BI_BITFIELDSがついている場合のことかな?
その場合は、V4HEADERのbV4RedMask〜bV4AlphaMaskの4フィールドが有効かどうかになります。
ヘッダー領域(bV4Size)のあとには来ません。
それと、おそらくですがBI_RGBの場合はアルファ画像にはならないと思います。

でもヘッダーを見た限りではV4/V5ともに通常のBMPフォーマットではアルファ画像を扱うかどうかははっきり書かれていないですね。
なのでどっちなのかわからない。。。

BI_PNGなら使えると思いますが、ビットイメージにPNGのどのデータをセットすればいいかが書かれてないのでこれもまたよくわからない。。。w
V4でアルファを扱うよりは素直にPNGにしたほうがいいような気がします。

引用返信 編集キー/
■60247 / inTopicNo.5)  Re[4]: BMPファイルをBgra32形式で読み込みたい
□投稿者/ K (3回)-(2011/06/23(Thu) 23:35:01)
> BI_PNGなら使えると思いますが、ビットイメージにPNGのどのデータをセットすればいいかが書かれてないのでこれもまたよくわからない。。。w
> V4でアルファを扱うよりは素直にPNGにしたほうがいいような気がします。

いろいろやってみたんですが、WICのBMPデコーダではダメそうです。
PNGならいけそうなので、おとなしくPNGにしようと思います。

ありがとうございました。

解決済み
引用返信 編集キー/
■60248 / inTopicNo.6)  Re[5]: BMPファイルをBgra32形式で読み込みたい
□投稿者/ Azulean (770回)-(2011/06/23(Thu) 23:42:34)
みるとすれば、この辺とか。

http://msdn.microsoft.com/en-us/library/ee719797.aspx#bmp_image_format
> BMP Image Format
> Pixel Format / Encodes As... / Decodes As...
> GUID_WICPixelFormat32bppBGRA / GUID_WICPixelFormat32bppBGR / Not Supported
> GUID_WICPixelFormat32bppPBGRA / GUID_WICPixelFormat32bppBGR / Not Supported

結果は変わりませんが。
解決済み
引用返信 編集キー/
■60263 / inTopicNo.7)  Re[6]: BMPファイルをBgra32形式で読み込みたい
□投稿者/ K (4回)-(2011/06/24(Fri) 22:39:22)
ありゃ、思いっきり Not Supportedて書いてありますね。
調査不足でした。

ありがとうございます。
しかし、64bitのエンコードが対応になってますね。
試してませんが。

No60248 (Azulean さん) に返信
> みるとすれば、この辺とか。
>
> http://msdn.microsoft.com/en-us/library/ee719797.aspx#bmp_image_format
>>BMP Image Format
>>Pixel Format / Encodes As... / Decodes As...
>>GUID_WICPixelFormat32bppBGRA / GUID_WICPixelFormat32bppBGR / Not Supported
>>GUID_WICPixelFormat32bppPBGRA / GUID_WICPixelFormat32bppBGR / Not Supported
>
> 結果は変わりませんが。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -