質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

660閲覧

bmp画像をモザイク処理したい

iri-ryo

総合スコア2

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2022/11/28 02:33

編集2022/12/07 00:44

前提

ボタンを押した際にbmp画像を違う領域にモザイク処理させた状態で出力させたい

実現したいこと

  ・左画像の10(縦)×10(横)ピクセル分のR/G/Bのそれぞれの平均を求める
Rの平均=10*10の色データのRの合計/100
・右画像の同じ10×10の領域すべてに求めた平均の色をRGBマクロで設定
・縦、横それぞれ10ピクセルずつ処理をずらしながら画像全体を処理

左側の画像の座標(0,0)から(10,10)までのRGB値の平均を求めたら、右側の同じ座標にRGBの平均値を出力する
それが終われば(0,11)から(10,20)を求めて、右側の同じ座標に平均値を出力していく…というような処理になります
画像全体が300×300ピクセルで構成されているので、繰り返しの処理が30回行われると思います

下図が実行イメージです

左側の画像の情報(RGB値の平均)を取得し、右側に出力したいと思っています
イメージ説明

発生している問題・エラーメッセージ

画像全体に処理が適用されない。

エラーメッセージ

該当のソースコード

C++

ソースコード ```int btnid = MessageBox("ボタンが押されました。", "確認", MB_OK | MB_ICONINFORMATION); //画像の縦横の範囲を宣言 int Width = m_img_left.GetWidth(); //横幅全体 int height = m_img_left.GetHeight(); //縦幅全体 int x = 10; int y = 10; int beside = 0; int vertical = 0; int R_beside = 0; int R_vertical = 0; for(x; (x <= Width); x += 10) { for(y; (y <= height); y += 10) { int r_sum = 0; int g_sum = 0; int b_sum = 0; for(beside = 0; (beside < x); beside++) { for(vertical = 0; (vertical < y); vertical++) { COLORREF color = m_img_left.GetPixel(beside,vertical); //左の画像から色情報を抜き取りcolorに格納 int r = GetRValue(color); //色情報取得 int g = GetGValue(color); int b = GetBValue(color); r_sum = r_sum + r; //RGBそれぞれの値を加算代入する g_sum = g_sum + g; b_sum = b_sum + b; } } int red = r_sum / 100; //加算したRの値を割り算 int green = g_sum / 100; //加算したGの値を割り算 int blue = b_sum / 100; //加算したBの値を割り算 for(R_beside = 0; (R_beside < x ); R_beside++){ for(R_vertical = 0; (R_vertical < y ); R_vertical++){ m_img_right.SetPixel(R_beside,R_vertical,RGB(red,green,blue)); } } } }Invalidate(); // 再描画 } ### 試したこと ここに問題に対して試したことを記載してください。 ネットでモザイク処理に関して調べた ### 補足情報(FW/ツールのバージョンなど) Visual Studio 2012  ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2022/11/28 02:58

ぱっと見で,ループの仕方が不思議なので,どういう処理を考えているのかを詳細に説明する必要があるように見受けます. 各変数の意味とか,各ループの範囲が何故こうなっているのか?等.(…を他人に説明しようとすれば,その過程で間違いに気づけるかも)
fana

2022/11/28 03:05 編集

例えば > for(beside = 0; (beside < x); beside++) とか. 例えば x の値が外側のループで増えていって 200 になっているとき,このループでの beside の値は 0~199 の範囲になりそうだけど,行おうとしている処理のことを考えると,多重ループの内側のところにそんな範囲でループする処理を入れる必要があるとは思えない.
iri-ryo

2022/11/28 04:05

コメントありがとうございます 質問の内容を更新しましたので確認をお願いします
guest

回答2

0

自己解決

アドバイス等を頂き、解決することができました。
ループする際の初期値を0にしていることで常に同じエリアをループし続けることになっていることと
そうしないためには、変数に変数を代入することで値を保持させることができること
あとは足してダメなら引いてみることを今回の課題で得ることができたと思います

イメージ説明

int btnid = MessageBox("ボタンが押されました。", "確認", MB_OK | MB_ICONINFORMATION); //画像の縦横の範囲を宣言 int Width = m_img_left.GetWidth(); //横幅全体 int height = m_img_left.GetHeight(); //縦幅全体 int x; int y; int X = 0; int Y = 0; int beside = 0; int vertical = 0; int R_beside = 0; int R_vertical = 0; for(x = 10; (x <= Width); x += 10) { for(y = 10; (y <= height); y += 10) { int r_sum = 0; int g_sum = 0; int b_sum = 0; for(beside = x - 10; (beside < x); beside++) { for(vertical = y - 10; (vertical < y); vertical++) { COLORREF color = m_img_left.GetPixel(beside,vertical); //左の画像から色情報を抜き取りcolorに格納 int r = GetRValue(color); //色情報取得 int g = GetGValue(color); int b = GetBValue(color); r_sum = r_sum + r; //RGBそれぞれの値を加算代入する g_sum = g_sum + g; b_sum = b_sum + b; } } int red = r_sum / 100; //加算したRの値を割り算 int green = g_sum / 100; //加算したGの値を割り算 int blue = b_sum / 100; //加算したBの値を割り算 for(R_beside = x - 10; (R_beside < x); R_beside++){ for(R_vertical = y - 10; (R_vertical < y); R_vertical++){ m_img_right.SetPixel(R_beside,R_vertical,RGB(red,green,blue)); } } } }Invalidate(); // 再描画

}

投稿2022/11/29 00:44

iri-ryo

総合スコア2

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

c

1 for(beside = 0; (beside < x); beside++) { 2 for(vertical = 0; (vertical < y); vertical++) {

このループは 10x10 の領域を処理する意図だと思います。xy は 10 ずつ増えていきますが、たとえば x=100 y=100 のときにこの besidevertical はどういう値でループするかチェックしてみてください。10x10 になるでしょうか。

投稿2022/11/28 04:41

int32_t

総合スコア20941

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

iri-ryo

2022/11/28 05:15

besideとverticalの初期値を0にしていることで、xとyの値が100だとbesdeとverticalの値は100になるまでループし続けるので、10×10にはならないですね
int32_t

2022/11/28 05:20

そうですよね。たぶん beside vertical ともに 90 から始めるといいのではないですかね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問