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

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

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

Re[2]: LockBitsを使用した時のことについて


(過去ログ 20 を表示中)

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

■8647 / inTopicNo.1)  LockBitsを使用した時のことについて
  
□投稿者/ 月 (1回)-(2007/10/04(Thu) 20:09:36)

分類:[C#] 

VisualBasic2005 C#を使用しています。
LockBitsを使用して絵の色を操作しようとしているのですが、配列内のデータの並びが分からずに困っています。

            
      Rectangle rect2 = new Rectangle(0, 0, w, h);
            BitmapData bmpDate = mat.LockBits(rect, ImageLockMode.ReadWrite, mat.PixelFormat);
      IntPtr ptr = bmpDate.Scan0;
            int bytes = w * h * 3;
            byte[] rgbValues = new byte[bytes];
            System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, bytes);

このあたりで、rgbValuesにデータが入っているのは分かるのですが。
どのような情報がどういう並びで入っているのでしょうか?
分かったのは、絵の左上端1ピクセルのRGBの色情報がrgbValues[0]〜[2]にBGRという順番で入っているのはわかったのですが、他のビットの色をフォトショップで見たところ情報と合いませんでした。

rgbValues[0] ←B
rgbValues[1] ←G
rgbValues[2] ←R
rgbValues[3]



private void SetPixcel()
        {

            Rectangle rect2 = new Rectangle(0, 0, w, h);
            BitmapData bmpDate = mat.LockBits(rect, ImageLockMode.ReadWrite, mat.PixelFormat);
            IntPtr ptr = bmpDate.Scan0;
            int bytes = w * h * 3;
            byte[] rgbValues = new byte[bytes];
            System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, bytes);

            ///////rgbValuesの値を配列に入れる
            for (int ret = 0; ret < 3; ret++)
            {
                for (int z = ret; z < h * w * 3; z=z + 3) 
                {
                    int x2=0,y2=0;
                    y2 = z / 3;
                    if(y2<=h)
                    {
                    ar[x2, y2][ret] = rgbValues[z];

                    }
                    x2++;
                    if (x2 > w) {x2 =1; }
                    
                }
            }
    }

引用返信 編集キー/
■8648 / inTopicNo.2)  Re[1]: LockBitsを使用した時のことについて
□投稿者/ ぽぴ王子 (267回)-(2007/10/04(Thu) 20:21:10)
ぽぴ王子 さんの Web サイト
No8647 (月 さん) に返信

ちょうど先日少しそのあたりをさわってみたところだったので。

まず前提として、もしかするとBGRの3バイトではなく、BGRAの4バイトで構成されていたりしませんか?
Color 構造体のヘルプを見ていただくとわかりますが、色の三原色以外にアルファ値を持っているのだと思われます。

なので
> 絵の左上端1ピクセルのRGBの色情報がrgbValues[0]〜[2]にBGRという順番で入っているのはわかったのですが、他のビットの色をフォトショップで見たところ情報と合いませんでした。
左上端1ピクセルは読めても、その先をズレた状態で読み込んでいるのではないかと思います。

その辺を見直してみてください。
引用返信 編集キー/
■8651 / inTopicNo.3)  Re[2]: LockBitsを使用した時のことについて
□投稿者/ Hongliang (196回)-(2007/10/04(Thu) 22:25:32)
Hongliang さんの Web サイト
LockBits に渡す PixelFormat がポイント。
Image.GetPixelFormatSize を使えば一ピクセル何ビットを使用するかも取得できます。
引用返信 編集キー/
■8653 / inTopicNo.4)  Re[1]: LockBitsを使用した時のことについて
□投稿者/ IIJIMAS (38回)-(2007/10/04(Thu) 23:52:06)
No8647 (月 さん) に返信
MSDNライブラリは参照されてますでしょうか。
PixelFormat 列挙体
http://msdn2.microsoft.com/ja-jp/library/system.drawing.imaging.pixelformat(VS.80).aspx

幅とStrideの関係にもご注意ください。
BitmapData.Stride プロパティ
http://msdn2.microsoft.com/ja-jp/library/system.drawing.imaging.bitmapdata.stride(VS.80).aspx

引用返信 編集キー/
■8658 / inTopicNo.5)  Re[2]: LockBitsを使用した時のことについて
□投稿者/ 月 (2回)-(2007/10/05(Fri) 01:44:59)
mat.PixelFormatをFormat24bppRgbにしたところ、うまくいきました!
皆さんありがとうございました!

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


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

このトピックに書きこむ

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

管理者用

- Child Tree -