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

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

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

Re[6]: 画像データからバイト配列


(過去ログ 91 を表示中)

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

■54178 / inTopicNo.1)  画像データからバイト配列
  
□投稿者/ SUKIYA (3回)-(2010/10/07(Thu) 19:06:26)

分類:[.NET 全般] 

次の方法でデスクトップ画像をバイト配列にしようとしているのですが、うまくいきません。
どなたかご教授願えますでしょうか。

Bitmap bmp = new Bitmap(myRectangle.Width, myRectangle.Height, PixelFormat.Format24bppRgb);
using (Graphics g = Graphics.FromImage(bmp))
{
g.CopyFromScreen(myRectangle.X, myRectangle.Y, 0, 0, myRectangle.Size, CopyPixelOperation.SourceCopy);
g.InterpolationMode = InterpolationMode.Default;
}

このあと、変数bmpをバイト配列に変換してpixelsへ代入しようとしています。

BitmapData bitd = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
IntPtr scan0 = bitd.Scan0;

byte[] pixels = new byte[bitd.Height * bitd.Width];
Marshal.Copy(scan0, pixels, 0, pixels.Length);
bmp.UnlockBits(bitd);

pixelsにデータは入っているのですが、検証するために、一度Bitmapオブジェクトに戻したでさらにBitmap形式で保存して画像を参照すると
予期しない絵になっています。(正しくはデスクトップ画像が表示されるはずです)


宜しくお願い致します。
引用返信 編集キー/
■54180 / inTopicNo.2)  Re[1]: 画像データからバイト配列
□投稿者/ すなふきぬ (59回)-(2010/10/07(Thu) 20:13:16)
No54178 (SUKIYA さん) に返信
> pixelsにデータは入っているのですが、検証するために、一度Bitmapオブジェクトに戻したでさらにBitmap形式で保存して画像を参照すると
> 予期しない絵になっています。(正しくはデスクトップ画像が表示されるはずです)

ビットマップの構造は理解できていますか?

http://www.kk.iij4u.or.jp/~kondo/bmp/

ここでバイト配列として取得したpixelsは、上記のサイトで言う画像データ部分に相当します。

Bitmapオブジェクトに戻したと記載してありますが、どの様なコーディングで戻したのでしょうか?
画像データからBitmapインスタンスを作成するなら、BITMAPINFOHEADER、BITMAPFILEHEADERを用意して、ヘッダ領域を含むメモリを確保、複写。ImageConverterのConvertFromでBitmapオブジェクトに変換するのが簡単かなと思います。
注意するのは、BITMAPINFOHEADERのbiSizeImageを4バイト境界の補正をかけて登録することくらいでしょうか。

上記の手順でBitmapオブジェクトを作成すれば、バイト配列からBitmapオブジェクトを生成し、PictureBox等にも表示できるはずです。
引用返信 編集キー/
■54181 / inTopicNo.3)  Re[2]: 画像データからバイト配列
□投稿者/ Hongliang (732回)-(2010/10/07(Thu) 21:38:13)
そのバイト配列をどうしたいんでしょうか?
大抵は、Save メソッドで事足りるはずですが。
引用返信 編集キー/
■54182 / inTopicNo.4)  Re[3]: 画像データからバイト配列
□投稿者/ すなふきぬ (60回)-(2010/10/07(Thu) 22:19:37)
No54181 (Hongliang さん) に返信
> そのバイト配列をどうしたいんでしょうか?
> 大抵は、Save メソッドで事足りるはずですが。

あぁ、なんとなく言いたいことがわかりました。

提示されたソースに無かったので、先頭に

Rectangle myRectangle = (Screen.AllScreens[0]).Bounds;

末尾に
this.pictureBox1.Image = bmp;

で検証してみました。
結果は、実行時のスクリーン上の画像が取得されているので、SUKIYAさんの期待する「デスクトップ画像」ではないのではないでしょうか?

> 予期しない絵になっています。(正しくはデスクトップ画像が表示されるはずです)

この「予期しない絵」の状態や、「正しくはデスクトップ画像が表示されるはず」って言うソースなり提示してもらえれば、もう少し調査・説明できると思います。
引用返信 編集キー/
■54189 / inTopicNo.5)  Re[4]: 画像データからバイト配列
□投稿者/ SUKIYA (4回)-(2010/10/08(Fri) 12:28:22)
すなふきんぬさん、Hongliangさん 返信有難うございます。

すいません、戻しのところを書いていませんでした。
改めて確認していたところ、正常に画像を見ることができました。次のコードになります。
しかし疑問点が残りました。

// Capture
Rectangle myRectangle = Screen.PrimaryScreen.Bounds;
Bitmap bmp = new Bitmap(myRectangle.Width, myRectangle.Height, PixelFormat.Format24bppRgb);
using (Graphics g = Graphics.FromImage(bmp))
{
g.CopyFromScreen(myRectangle.X, myRectangle.Y, 0, 0, myRectangle.Size, CopyPixelOperation.SourceCopy);
g.InterpolationMode = InterpolationMode.Default;
}

// Bitmap->byte[]
BitmapData bitd = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
IntPtr scan0 = bitd.Scan0;
byte[] pixels = new byte[bitd.Height * bitd.Width * 3];
Marshal.Copy(scan0, pixels, 0, pixels.Length);
bmp.UnlockBits(bitd);

// byte[]->Bitmap
Bitmap bmp2 = new Bitmap(myRectangle.Width, myRectangle.Height, PixelFormat.Format24bppRgb);
BitmapData bitd2 = bmp2.LockBits(new Rectangle(0, 0, bmp2.Width, bmp2.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
Marshal.Copy(pixels, 0, bitd2.Scan0, pixels.Length);
bmp2.UnlockBits(bitd2);

bmp2.Save("C:\\test.bmp", ImageFormat.Bmp);

ここで、Bitmap->byte[]の箇所について。
byte[] pixels = new byte[bitd.Height * bitd.Width * 3];
の*3はどのような意味があるのでしょうか。
これが無いことで、Save後に画像データを参照すると、3分の2ほど欠落していました。
引用返信 編集キー/
■54190 / inTopicNo.6)  Re[5]: 画像データからバイト配列
□投稿者/ shu (88回)-(2010/10/08(Fri) 12:30:51)
No54189 (SUKIYA さん) に返信
> ここで、Bitmap->byte[]の箇所について。
> byte[] pixels = new byte[bitd.Height * bitd.Width * 3];
> の*3はどのような意味があるのでしょうか。
> これが無いことで、Save後に画像データを参照すると、3分の2ほど欠落していました。
1ピクセルが24bit=(8*3bit)=3Byteなので*3です。
引用返信 編集キー/
■54198 / inTopicNo.7)  Re[6]: 画像データからバイト配列
□投稿者/ SUKIYA (5回)-(2010/10/08(Fri) 18:43:58)
shuさん、返信ありがとうございます。
良く分りました。本件はこれで解決とさせて頂きます。

解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -