現在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);
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.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」に固定されているとの保証があるなら、この回答は無視して下さい。
回答ありがとうございます。
時間がだいぶかかってしまいましたが、回答を参考にさせていただいた結果なんとかできました^^ありがとうございます。
No.1
- 回答日時:
回答ありがとうございます。
時間がだいぶかかってしまいましたが、回答を参考にさせていただいた結果なんとかできました^^ありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) エクセルVBA ダブルクリックしたら色反転を指定したセルのみにしたい 2 2022/04/06 12:52
- HTML・CSS プログラムの関連性を教えて下さい。 1 2023/07/19 03:50
- HTML・CSS html/cssで要素が出てこなくて困ってます 1 2022/12/31 16:59
- HTML・CSS cssの display: flex;で横並びにならずに困ってます 1 2022/12/04 13:18
- HTML・CSS アコーディオンメニューが思うように動作しません。 1 2023/08/20 16:48
- HTML・CSS cssが効かなくて困ってます 1 2023/01/01 23:57
- HTML・CSS htmltとcssの連携をして画像縮小について 1 2022/11/15 20:32
- HTML・CSS html cssのmargin 5 2022/12/03 11:04
- HTML・CSS ただいま勉強始めたての初心者です。フォームを縦並べにしたいです。 2 2022/11/20 17:18
- オープンソース cssで中央寄せ 1 2023/05/19 06:25
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
intとlongは同じ?
-
C#で疑似カラー
-
画像の拡大・縮小
-
C言語のプログラムについて(...
-
再起呼び出しの回数をカウント...
-
OpenCV輪郭抽出→座標取得でのバ...
-
OpenCVによる4値化について
-
異なるn個の整数からr個の整数...
-
C言語の問題
-
C言語プログラミング 漸化式に...
-
1.4なのに
-
分数の足し算をさせるプログラ...
-
C言語で%を使わない余りの出し方
-
へんな現象
-
Enterキーを押されたら次の処理...
-
#define _CRT_SECURE_NO_WARNIN...
-
マイナスからプラスへ転じた時...
-
*をユーザーが入力した数字の数...
-
2÷3などの余りについて
-
10個出力で改行したいのですが...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
2の補数を計算するプログラム
-
intとlongは同じ?
-
再起呼び出しの回数をカウント...
-
C言語で%を使わない余りの出し方
-
迷路を脱出する経路探索プログ...
-
画像の拡大・縮小
-
分数の足し算をさせるプログラ...
-
C言語で簡単なパックマンゲーム...
-
C++で表を作成したいのです ...
-
条件が多い場合
-
複数の共有メモリの作成
-
ヒストグラム均等化処理プログラム
-
3のつく数と3の倍数を表示 C言語
-
argvのNULLチェック
-
乱数で交互に偶数、奇数が、、、。
-
プログラミングに関して
-
OpenCVによる4値化について
-
whileとifを使い偶数を出すには
-
16bitで乱数を生成する方法
-
再帰処理をループ処理に変換
おすすめ情報