• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:幾何学変換)

Windowsアプリで画像を45度回転させるプログラムの作り方

このQ&Aのポイント
  • Windowsアプリケーションでボタン一つで画像を45度回転させるプログラムを作りたいです。
  • 回転変化後の画像には線形補間法(バイリニア法)を使っての補間処理をして表示させたいです。
  • 言語はC#を使用しています。

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

  • ベストアンサー
  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.1

「変な風に実行されます」というのだけでは、どういう状況下わからないのですが、 それは、所々に黒いポツポツが出るとか、そういった状況ですか? そうだとしたら、この手のプログラムでの典型的なミスですね。 質問者さんのコードは、 「変換元の各画素」について、「変換後の座標」を算出して、「その座標位置に書き込む」 この方法では「変換後の画像の全ての画素に書き込まれるとはかぎりません」ので、結果として、所々書き込まれずに黒いままの画素が出てきたりします。 ループを逆にして、 「変換先の各画素」についてループ処理して、 「変換前の座標」を算出(変換が45度回転なら、-45度回転した座標を求める)して、 「その座標の画素を取ってきて書き込む」 ようにすれば、そういった歯抜けはなくなります。 動作確認はしてませんが、質問者さんのコードは修正すると --- int iOffsetX1 = iWidth/2 int iOffsetY1 = iHeight/2; int iOffsetX2 = iWidth2/2 int iOffsetY2 = iHeight2/2; for (int m = 0; m < iHeight2; m++) { for (int n = 0; n < iWidth2; n++) { int i = (int)((n-iOffsetX2) * Math.Cos(X) - (m-iOffsetY2) * Math.Sin(X)) + iOffsetX1; int j = (int)((n-iOffsetX2) * Math.Sin(X) + (m-iOffsetY2) * Math.Cos(X)) + iOffsetY1; int iRed = colImage[j, i].R; int iGreen = colImage[j, i].G; int iBlue = colImage[j, i].B; if (i >= 0 && i < iWidth && j > 0 && j < iHeight) { colImage2[m, n] = Color.FromArgb(iRed, iGreen, iBlue); } } } --- こんな感じになるかと。

shamal1988
質問者

補足

回答ありがとうございます。 >>「変な風に実行されます」というのだけでは、どういう状況下わからないのですが、それは、所々に黒いポツポツが出るとか、そういった状況ですか? >>そうだとしたら、この手のプログラムでの典型的なミスですね。 これ何ですけど、実行すると画像に白い点が入り、画像の一部が欠けてしまいます。 それと自分の書いたプログラムのfor文から回答者様のプログラムを書き換えて実行してみたのですが、iRedの所で「インデックスが配列の境界外です」って表示されプログラムが停止しました。

その他の回答 (2)

  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.3

> 回転した画像がPictureボックス内にキッチリと入らずハミ出て回転した画像が欠けてしまいます。 はみ出るのが1~2ドットだとしたら、 --- int iHeight2 = (int)(iWidth * Math.Cos(X) + iHeight * Math.Sin(X)); int iWidth2 = (int)(iWidth * Math.Sin(X) + iHeight * Math.Cos(X)); --- ここで、整数にしている(切り捨てている)から、結果の画像サイズが小さくなってしまっているからでしょう。切り上げる必要があります。

  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.2

> iRedの所で「インデックスが配列の境界外です」って表示されプログラムが停止しました。 すみません、ifの配置を間違えました。 iRed~iBlueの代入はifの中で、 --- if (i >= 0 && i < iWidth && j > 0 && j < iHeight) { int iRed = colImage[j, i].R; int iGreen = colImage[j, i].G; int iBlue = colImage[j, i].B; colImage2[m, n] = Color.FromArgb(iRed, iGreen, iBlue); } --- といった感じになります。 …ていうか、これは、 --- if (i >= 0 && i < iWidth && j > 0 && j < iHeight) { colImage2[m, n] = colImage[j, i]; } --- で十分ですね。

shamal1988
質問者

補足

ありがとうございます。 何度も申し訳ありません。 実行できたのですが、回転した画像がPictureボックス内にキッチリと入らずハミ出て回転した画像が欠けてしまいます。どうすればよろしいでしょうか。

関連するQ&A