2010/07/27(Tue) 01:26:21 編集(投稿者)
■No51934 (saw さん) に返信
> >Azuleanさん
> 回答ありがとうございます。
>
> 私もサンプルを出してしまうのが早いとは思っているのですが、その画像は人が映っていたりするため、公の場に航海することができません。
> 質問しておきながら、情報をこれ以上提供できないという、申し訳ない状況ですいません。
>
> 画像のファイルから、読み込んでと言う部分を確認するのが抜けていたので、確認を行ってみます。
画像関係はGDI+で変換する場合はちょっと工夫が必要かもしれません。
画像の特定ができていないとのことですが、以前、似たような問題で悩んだので調べる部分を何点か。
・ImageのPixelFormatがFormat24bppRgbに変換できないような画像
(gifなんかでパレットを指定している場合や圧縮方法が指定されている場合は同様のGDI+汎用エラーが出てたような気がします。)
・画像読み込みをFromStreamにする、Imageで読み込んで一旦Bitmapに変換する。
(特定の画像のみで出るのなら、上記の方が濃厚な気がします)
.NETで画像を読み込む場合は、プロセスで掴んでしまう現象が発生するので、私はこんな感じで読み込みをしています。
using (FileStream fs = new FileStream(fname, FileMode.Open))
using (Image img = Image.FromStream(fs))
{
Bitmap bmp = new Bitmap(img);
bmp.SetResolution(img.HorizontalResolution, img.VerticalResolution);
return bmp;
}
私の場合は、機器から来るDIBデータをコードで変換していたので、DIBからBITMAPINFOHEADER、BITMAPFILEHEADERを算出して
生のBITMAP構造体を作成してから生成して切り抜けました。
BITMAP構造体のバイト配列からBitmapを生成するコードはこんな感じです。(ヘッダー部の生成を載せると結構な量になるので割愛します)
BITMAPINFOHEADER bih = new BITMAPINFOHEADER();
BITMAPFILEHEADER bfh = new BITMAPFILEHEADER();
// (ヘッダ生成をごにょごにょ・・・)
// BITMAP形式のメモリ領域を作成する
byte[] bImage = new byte[bfh.bfSize];
fixed (void* pbfh = &bfh.bfType)
{
Marshal.Copy((IntPtr)pbfh, bImage, 0, Marshal.SizeOf(bfh));
Marshal.Copy(lpDib, bImage, Marshal.SizeOf(bfh), bih.biSize + bih.biSizeImage);
}
// BITMAPに変換後返却
ImageConverter iconv = new ImageConverter();
return (Bitmap)iconv.ConvertFrom(bImage);
読み込みの失敗するファイルがあれば調べることもできますが、公開できないようなのでちょっとずつ原因を切り分けていくしかないですね。
#長い文章があったので改行を挿入しました。