VC++8.0を使用し、VistaSP1、XpSP3のアプリケーションを作成しております
GDI+で以下の画像ファイルを読み込んでいます
(1)Jpeg RGB 8Bit
(2)Jpeg CMYK 8Bit
(3)TIFF RGB 8Bit
(4)TIFF RGB 16Bit
(5)TIFF CMYK 8Bit
(6)TIFF CMYK 16Bit
このとき、(1)~(4)までの画像は正しく取得できるのですが、(5)(6)が正しく取得できません
(5)は像構造は正しいのですが、色が少し違う
(6)は像構造も色もおかしい
といった状態です
これはDGI+の仕様なのでしょうか?それとも、使い方が悪いのでしょうか?
MSDを見ても、扱えるフォーマットにJpegとTIFFが記載されているだけで、チャンネル、
Bits/smple等の記載が見当たりません
ご存知なかたいましたら教えてください
私も同じことで以前にはまりました。
TIFF自体に多くのフォーマットがあります。
その中には互換性のないものも含まれています。
ペイントブラシでTIFFとして保存したファイルを読み込んでみてください。
きちんと読み込めるはずです。
そういうことです。
bun様
ありがとうございます
Image::GetPixelFormat()の結果を見ると
TIFF CMYK 8Bitの場合にαチャンネルつきのRGB 32Bit、TIFF CMYK 16Bitの場合にも、
αチャンネルつきのRGB 32Bitと判定されてしまいました
ちなみに、TIFF CMYK 8Bitが表示できないは誤りで、表示できました
>ペイントブラシでTIFFとして保存したファイルを読み込んでみてください。
>きちんと読み込めるはずです。
ペイントブラシでは、TIFFはRGBの8Bitしか保存できません
Image::GetPixelFormat()の結果はそれぞれ
(1)Jpeg RGB 8Bit=PixelFormat24bppRGB
(2)Jpeg CMYK 8Bit=PixelFormat24bppRGB
(3)TIFF RGB 8Bit=PixelFormat24bppRGB
(4)TIFF RGB 16Bit=PixelFormat32bppARGB
(5)TIFF CMYK 8Bit=PixelFormat48bppRGB
(6)TIFF CMYK 16Bit=PixelFormat32bppARGB
でした
このうち正しい判断だと思えるのは、(1)、(3)、(4)、(5)です
(2)はPixelFormat32bppARGBJpegと判定すべき?
(6)はPixelFormat64bppARGBと判定すべき?
GDI+で読み込んで表示すると自前のライブラリを使用するより早いので採用したいのだ
が、(6)が表示できない
かっこ悪いが、PixelFormat32bppARGBと判定されたら自前のライブラリを使用するっての
も手ではあるけど・・・
> これはDGI+の仕様なのでしょうか?それとも、使い方が悪いのでしょうか?
結論としては、仕様ということです。
>> これはGDI+の仕様なのでしょうか?それとも、使い方が悪いのでしょうか?
>結論としては、仕様ということです。
仕様(不具合と言いたいところ)見たいですね
気になるのはVistaのエクスプローラでこれらのファイルがあるフォルダを選択し、表示
条件を大アイコンと選択すると正しく画像が見れます
しかしXpのエクスプローラでは私のプログラムと同じ表示になります
これはVistaでGDI+1.1、XPでGDI+1.0が採用されているため???
VC++8.0でビルドするときに、GDI+1.0がリンクされてしまっている???
あるいはラインタイムの問題なのだが、サイドbyサイドを上手く利用できていないため
に、Vista上も、GDI+1.0のランタイムが呼び出されて表示できていない???
あたりも気になりますのでもうちょっと調べて見ます
VC++9.0やVC++10.0だと問題なく表示されてたりして?
> これはVistaでGDI+1.1、XPでGDI+1.0が採用されているため???
だとすれば、Vista で GdiPlusStartup に GdiplusStartupInputEx を渡してやればうま
くいったりして?
Vista では GDI 周りに大幅な変更が入っていますから、そもそもプレビュー表示に
GDI+ を使ってない可能性もありますが、まぁ、物は試しですね。
>Vista では GDI 周りに大幅な変更が入っていますから、そもそもプレビュー表示に
>GDI+ を使ってない可能性もありますが、まぁ、物は試しですね。
Windows VistaではHD Photoファイル(wdpファイル)が標準サポートされているので
少なくとも画像の読み込みにはWICのデコーダが使われているはず(?)
最低限動くサンプル
http://msdn.microsoft.com/ja-jp/magazine/cc500647.aspx
aetos様、subaru様
回答ありがとうございます
GDI+だけでは無理そうなので、上記している通り自前のライブラリも併用して作成する
ことにしました
RGBのTIFF/Jpegの場合にはGDI+を使用して読み込んでそのまま表示、CMYKのTIFF/Jpeg
の場合には自前のライブラリで読み込みImage::Bitmapを生成し、その後はGDI+で読み込
んだコードと同じでよいと考えましたがうまく行きません
CMYKのままではうまく行かないのでは?と思い、RGB 24Bitに変換して
Image::Bitmap* image = new Image::Bitmap(width, hight,
stride,PixelFormat24bppRGB, Buf);
width = 読み込んだ画像の幅
hight = 読み込んだ画像の高さ
stride = MSDNを参考に、(width + 3) & ~3
Buf = 読み込んだ画像のデータ
としてもうまくいきません。何か設定が間違っているのでしょうか???
BufはRGBの点順次にしています
あっ?もしかしてBGR?・・・これは試してみます
Image::Bitmap* image = new Image::Bitmap(width, hight,
stride,PixelFormat24bppRGB, Buf);
でなく
Gdiplus::Bitmap* image = new Gdiplus::Bitmap(width,
hight,stride,PixelFormat24bppRGB, Buf);
でした
しかし、このコンストラクタは正しく動作しないようですね
不具合があるみたいです
青(0,0,255)で埋めたメモリを渡しても、正しく青ベタで埋めてくれるときとそうでな
いときがあります
画像のサイズによるようです
幅473、高さ356くらいのサイズだどうまく行きません
別途、Gdiplus::Bitmapのコンストラクト方法を質問することにします
> 青(0,0,255)で埋めたメモリを渡しても、正しく青ベタで埋めてくれるときとそうで
な
> いときがあります
見当違いかもしれませんが、
BMPは1ラインが4バイト単位で切り上げなのは関係ないですか?
ISLe様
回答ありがとうございます
上記している
stride = MSDNを参考に、(width + 3) & ~3
で計算して4バイト境界には対応しております
最終的には、このコンストラクタを諦めて解決しました
> stride = MSDNを参考に、(width + 3) & ~3
> で計算して4バイト境界には対応しております
Bufの中身も
(幅473ピクセルの場合)
:
473ピクセル目 R(1バイト)
473ピクセル目 G(1バイト)
473ピクセル目 B(1バイト)
ダミー (1バイト)
のように1ラインごとに末尾に1バイト挟む必要があるのでは?
ISLe様
もちろん、パディングしたバッファを渡しています
RGB、BGR,点順次、線順次、面順次等もいろいろためしてだめでした