9

次の画像を検討すると、32x32のサイズのかなり基本的なアイコンです。テスト中に四隅を無地で塗りつぶしましたが、アイコンの周りは透明な長方形です。

ソース画像

ここで、このコードを考えてみましょう。このコードは、画像を単純に描画しますが、より大きなスケールで描画します。

protected override void OnPaint(PaintEventArgs e)
{
  base.OnPaint(e);

  e.Graphics.InterpolationMode = InterpolationMode.NearestNeighbor;
  e.Graphics.DrawImage(Properties.Resources.icon_32a, new RectangleF(0, 0, 512, 512), new RectangleF(0, 0, 32, 32), GraphicsUnit.Pixel);
}

私は完全な画像を描画しており、それをトリミングしようとはしておらず、拡大するだけであることに注意してください。

最後に、これはテストで得られる出力です。

塗装例

問題に気づきましたか?上の行と左の列のピクセルの半分が消えました。次に、この上にグリッドをオーバーレイしようとすると、グリッドが正しく配置されているため、かなりひどいように見えますが、画像はそうではありません。サイズを2倍の64にしただけでも、64はこの最初の行/列の切り抜きを導入します。

また、0,0より前に描画されている場合に備えて、宛先の長方形をオフセットしようとしましたが、そうではありませんでした。

また、さまざまな補間モードを試してみましたが、ブレを引き起こす頭痛の種からわかる限り、ピクセルはまだトリミングされていたので、補間モードによるものではないと思います。

また、さまざまなグラフィックモードを使用しようとしましたが、役に立たなかったという事実を除けば、とにかくピクセルに固執する必要があります。

好奇心から96dpiの画像の新しいコピーで再試行しましたが、同じ効果が得られたので、ソース画像の解像度ではないと思います。

ストローで握りしめたり、Rectangle代わりに使用したりしRectangleFても効果はありませんでした。

なぜこの見かけの作物が発生しているのかについて、誰かが手がかりを提供できますか?

ありがとう;

4

2 に答える 2

9

PixelOffsetModeデフォルトで次のように設定されていますPixelOffsetMode.Half

高速アンチエイリアシングのために、ピクセルが水平方向と垂直方向の両方で-.5単位オフセットされることを指定します。

あなたの場合、元の画像の半分のピクセルは、結果の画像の8ピクセルであり、これはまさにあなたが欠けているものです。

次のように設定してみてください:PixelOffsetMode.None PixelOffsetMode.HighQuality

protected override void OnPaint(PaintEventArgs e)
{
     base.OnPaint(e);

     e.Graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
     e.Graphics.InterpolationMode = InterpolationMode.NearestNeighbor;
     e.Graphics.DrawImage(Properties.Resources.icon_32a, new RectangleF(0, 0, 512, 512), new RectangleF(0, 0, 32, 32), GraphicsUnit.Pixel);
}
于 2012-12-28T13:36:52.330 に答える
3

ユーザーが確認した返信をカバーするだけで、自分で試してみたところ、問題はPixelOffsetMode.HighQuality代わりに解決されましたnone

c#

e.Graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;

私の場合、C ++で管理されています:

e->graphics->PixelOffsetMode = System::Drawing::Drawing2D::PixelOffsetMode::HighQuality;
于 2015-10-20T12:33:22.560 に答える