• ベストアンサー

画素へのアクセスについて困っています。

現在VC++2005でプログラムを組んでいますが、画素に対するアクセスをしたいですが、getpixel()以外の方法がありますか? 自分がやっているのは以下のようになります。 Color color = bmp->Getpixel(x,y); r = color.R, g = color.G, b = color.B; 下のようなアクセスを行いたいですが、フォームアプリケーションではどうすればよいでしょうか。 B = Bmpimage[x*3+y*bmpL]; G = Bmpimage[x*3+y*bmpL+1]; R = Bmpimage[x*3+y*bmpL+2]; ご教授よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

 こんばんは。  先程は大分投遣りな回答をしてしまったのですが、どうもそのURL通りに実行しても上手くいかない様です。  一応以下のやり方で出来ましたので、ご参考程度に。 Bitmap^ bmp = ←使用中のイメージ //ロックを掛ける Imaging::BitmapData^ bmpData = bmp->LockBits( Drawing::Rectangle(0, 0, bmp->Width, bmp->Height), Imaging::ImageLockMode::ReadWrite, bmp->PixelFormat); //イメージへのポインタを取り出す Byte* BmpImage = static_cast<Byte*>(bmpData->Scan0.ToPointer()); //画素数を求める const int bitsPerPixel = bmpData->Stride / bmp->Width; //ループする for(int y = 0; y < bmp->Height; ++y) { for(int x = 0; x < bmp->Width; ++x) { //以下お約束(1ライン毎の改行計算には、必ずStrideを使用した方が良さそうです) const int pos = x * bitsPerPixel + (y * bmpData->Stride); const int B = BmpImage[pos]; const int G = BmpImage[pos + 1]; const int R = BmpImage[pos + 2]; } } //ロックを解く bmp->UnlockBits(bmpData);  

その他の回答 (2)

回答No.3

>const int B = BmpImage[pos]; >const int G = BmpImage[pos + 1]; >const int R = BmpImage[pos + 2]; これでは、正しいデータは取得出来ません。 これでデータが取得出来るのは、PixelFormatプロパティが「Format24bppRgbかFormat32bppRgbかFormat32bppArgb」の時だけです。 http://msdn.microsoft.com/ja-jp/library/system.drawing.imaging.pixelformat.aspx PixelFormatプロパティが「Format24bppRgbかFormat32bppRgbかFormat32bppArgb」以外の時は「データをインデックス値として、パレットテーブルからRGB値を取り出す」とか「データが5ビットづつパックされてるので、5ビットづつ取り出して、8ビットに伸張する」などの処理が必要です。 それらの「面倒な処理を全部やって、RGB値を取り出してくれる関数」が「Getpixel」なのです。 Getpixelを使わず、PixelFormatプロパティの値が何になっているか気にせず処理したい場合は ・元画像のBMPイメージの他に、作業用のBMPを用意する。 ・作業用のBMPのPixelFormatプロパティを「Format24bppRgb」にする。 ・作業用のBMPの縦横のサイズを、元画像と同じにする。 ・CopyRect関数などで、元の画像を作業用BMPにコピーする。 ・これで作業用BMPのスキャンイメージは、RGB値が1バイトづつ並んでいるのが保証されるので int B = BmpImage[pos]; int G = BmpImage[pos + 1]; int R = BmpImage[pos + 2]; と言うアクセスで値を取り出す事が可能。 なお、元画像のPixelFormatプロパティが「Format24bppRgb」に固定されているとの保証があるなら、この回答は無視して下さい。

judas15
質問者

お礼

回答ありがとうございます。 時間がだいぶかかってしまいましたが、回答を参考にさせていただいた結果なんとかできました^^ありがとうございます。

回答No.1

 こんばんは。    以下のC++の部分が参考になるのではないでしょうか。  http://msdn.microsoft.com/ja-jp/library/system.drawing.imaging.imagelockmode(VS.80).aspx

judas15
質問者

お礼

回答ありがとうございます。 時間がだいぶかかってしまいましたが、回答を参考にさせていただいた結果なんとかできました^^ありがとうございます。