GDI+の対応フォーマット – プログラミング – Home

通知
すべてクリア

[解決済] GDI+の対応フォーマット

固定ページ 1 / 2

え~いち
 え~いち
(@え~いち)
ゲスト
結合: 19年前
投稿: 78
Topic starter  

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等の記載が見当たりません
ご存知なかたいましたら教えてください


引用未解決
トピックタグ
bun
 bun
(@bun)
ゲスト
結合: 24年前
投稿: 761
 

私も同じことで以前にはまりました。

TIFF自体に多くのフォーマットがあります。
その中には互換性のないものも含まれています。

ペイントブラシでTIFFとして保存したファイルを読み込んでみてください。
きちんと読み込めるはずです。

そういうことです。


返信引用
え~いち
 え~いち
(@え~いち)
ゲスト
結合: 19年前
投稿: 78
Topic starter  

bun様
ありがとうございます

Image::GetPixelFormat()の結果を見ると
TIFF CMYK 8Bitの場合にαチャンネルつきのRGB 32Bit、TIFF CMYK 16Bitの場合にも、
αチャンネルつきのRGB 32Bitと判定されてしまいました

ちなみに、TIFF CMYK 8Bitが表示できないは誤りで、表示できました


返信引用
え~いち
 え~いち
(@え~いち)
ゲスト
結合: 19年前
投稿: 78
Topic starter  

>ペイントブラシでTIFFとして保存したファイルを読み込んでみてください。
>きちんと読み込めるはずです。

ペイントブラシでは、TIFFはRGBの8Bitしか保存できません


返信引用
え~いち
 え~いち
(@え~いち)
ゲスト
結合: 19年前
投稿: 78
Topic starter  

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と判定されたら自前のライブラリを使用するっての
も手ではあるけど・・・


返信引用
bun
 bun
(@bun)
ゲスト
結合: 24年前
投稿: 761
 

> これはDGI+の仕様なのでしょうか?それとも、使い方が悪いのでしょうか?
結論としては、仕様ということです。


返信引用
え~いち
 え~いち
(@え~いち)
ゲスト
結合: 19年前
投稿: 78
Topic starter  

>> これは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だと問題なく表示されてたりして?


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

> これはVistaでGDI+1.1、XPでGDI+1.0が採用されているため???

だとすれば、Vista で GdiPlusStartup に GdiplusStartupInputEx を渡してやればうま
くいったりして?

Vista では GDI 周りに大幅な変更が入っていますから、そもそもプレビュー表示に
GDI+ を使ってない可能性もありますが、まぁ、物は試しですね。


返信引用
subaru
 subaru
(@subaru)
ゲスト
結合: 19年前
投稿: 381
 

>Vista では GDI 周りに大幅な変更が入っていますから、そもそもプレビュー表示に
>GDI+ を使ってない可能性もありますが、まぁ、物は試しですね。

Windows VistaではHD Photoファイル(wdpファイル)が標準サポートされているので
少なくとも画像の読み込みにはWICのデコーダが使われているはず(?)

最低限動くサンプル
http://msdn.microsoft.com/ja-jp/magazine/cc500647.aspx


返信引用
え~いち
 え~いち
(@え~いち)
ゲスト
結合: 19年前
投稿: 78
Topic starter  

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?・・・これは試してみます


返信引用
え~いち
 え~いち
(@え~いち)
ゲスト
結合: 19年前
投稿: 78
Topic starter  

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のコンストラクト方法を質問することにします


返信引用
ISLe
 ISLe
(@ISLe)
ゲスト
結合: 18年前
投稿: 38
 

> 青(0,0,255)で埋めたメモリを渡しても、正しく青ベタで埋めてくれるときとそうで

> いときがあります

見当違いかもしれませんが、
BMPは1ラインが4バイト単位で切り上げなのは関係ないですか?


返信引用
え~いち
 え~いち
(@え~いち)
ゲスト
結合: 19年前
投稿: 78
Topic starter  

ISLe様

回答ありがとうございます
上記している
stride = MSDNを参考に、(width + 3) & ~3
で計算して4バイト境界には対応しております

最終的には、このコンストラクタを諦めて解決しました


返信引用
ISLe
 ISLe
(@ISLe)
ゲスト
結合: 18年前
投稿: 38
 

> stride = MSDNを参考に、(width + 3) & ~3
> で計算して4バイト境界には対応しております

 Bufの中身も
  (幅473ピクセルの場合)
  :
  473ピクセル目 R(1バイト)
  473ピクセル目 G(1バイト)
  473ピクセル目 B(1バイト)
  ダミー (1バイト)
のように1ラインごとに末尾に1バイト挟む必要があるのでは?


返信引用
え~いち
 え~いち
(@え~いち)
ゲスト
結合: 19年前
投稿: 78
Topic starter  

ISLe様
もちろん、パディングしたバッファを渡しています
RGB、BGR,点順次、線順次、面順次等もいろいろためしてだめでした


返信引用
固定ページ 1 / 2

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました