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

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

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

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

解決済

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

iri-ryo
iri-ryo

総合スコア2

C++

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

2回答

0グッド

0クリップ

281閲覧

投稿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  ここにより詳細な情報を記載してください。

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

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

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

回答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

総合スコア17104

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

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 から始めるといいのではないですかね。

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

C++

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