3

変換行列を使用して回転した48x48の画像があります。

何らかの理由で、このスクリーンショットからわかるように、デザイン時の回転画像は実行時の回転画像とは異なります(リンクが切れています)(左側がデザイン時、右側が実行時):

見つけるのは少し難しいかもしれませんが、青い円の右端をよく見ると、右側の画像では約1ピクセル広くなっています。画像がレイヤー化されていることに注意してください。前景の白い輝きは回転している部分ですが、背景の青いボールは静止しています。

正確に90度(スクリーンショットのように)、180度、おそらく270度回転すると、実行時に画像が1ピクセルオフセットされているように見えます。私が見る限り、画像は他の回転角と同じように見えます。

スニペットは次のとおりです。

protected static Image RotateImage(Image pImage, Single pAngle)
    {
      Matrix lMatrix = new Matrix();
      lMatrix.RotateAt(pAngle, new PointF(pImage.Width / 2, pImage.Height / 2));
      Bitmap lNewBitmap = new Bitmap(pImage.Width, pImage.Height);
      lNewBitmap.SetResolution(pImage.HorizontalResolution, pImage.VerticalResolution);
      Graphics lGraphics = Graphics.FromImage(lNewBitmap);
      lGraphics.Transform = lMatrix;
      lGraphics.DrawImage(pImage, 0, 0);
      lGraphics.Dispose();
      lMatrix.Dispose();
      return lNewBitmap;
    }

    void SomeMethod()
    {
      // Same results in design-time and run-time:
      PictureBox1.Image = RotateImage(PictureBox2.Image, 18)
      // Different results in design-time and run-time.
      PictureBox1.Image = RotateImage(PictureBox2.Image, 90)
    }

誰かがこの行動の理由を説明できますか?または、さらに良いことに、実行時の結果を設計時の結果のように見せるためのソリューションはありますか?

この画像は、単一の画像に基づいてコードから生成され、小さなステップで回転するアニメーションの一部であるため、私にとって重要です。デザイン時に、アニメーションはスムーズで見栄えがします。実行時に、それは飛び回っているように見えます:/

Windows VistaBusinessSP2でVisualStudio2005を使用しています。

4

4 に答える 4

3

これは、PixelOffsetMode のように、設計時と実行時に使用される Graphics オブジェクトの違いに関係している可能性があります。

于 2009-07-14T11:35:08.923 に答える
0

これは、浮動小数点で実行される数学についての問題になるはずだと思います。整数座標に丸める場合。

関連するかもしれない1つの質問...あなたの画像は完全に正方形で、幅と高さは偶数ですか?たぶん問題はそこにあります。

編集:最初の読み取りで、画像の寸法を確認しました...それが問題ではなかった場合は、自分で簡単な回転を行うことができます。

angle = 90 : img[i][j] = img[j][w-i]
angle = 180: img[i][j] = img[w-i][w-j]
angle = 270: img[i][j] = img[w-j][i]

(インデックスの交換は問題ないと思いますが、ダブルチェックは悪くありません)

于 2009-07-14T13:29:59.563 に答える
0

回転角度をどのように指定していますか? 度またはラジアンで?

ラジアンであるはずの角度を誤って度で指定したときに、あなたが説明したような結果が得られることがあります(その結果、オブジェクトは数度ではなく数百度回転しました)

あなたの具体的な例が与えられているかどうかはわかりませんが、提案する価値があります。

于 2009-07-14T09:16:43.913 に答える
0

うーん、私の考慮​​事項は試してみることです:

lMatrix.RotateAt(pAngle, new PointF((pImage.Width + 1)/2.0f, (pImage.Height + 1)/ 2.0f));
于 2009-07-14T09:37:00.490 に答える