プロが教えるわが家の防犯対策術!

現在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];
ご教授よろしくお願いします。

A 回答 (3件)

 こんばんは。


 先程は大分投遣りな回答をしてしまったのですが、どうもその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);

 
    • good
    • 0

>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.d …

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」に固定されているとの保証があるなら、この回答は無視して下さい。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/01/21 20:22

 こんばんは。


 
 以下のC++の部分が参考になるのではないでしょうか。
 http://msdn.microsoft.com/ja-jp/library/system.d …
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/01/21 20:22

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!