2012-12-28 8 views
7

次のイメージを考えてみると、これはかなり基本的なアイコンで、サイズは32x32です。アイコンの周りには透明な長方形がありますが、テスト中に四隅を単色で塗りつぶしました。 Graphics.DrawImageが画像の一部を切り取るのはなぜですか?

Source Image

は今、単純に画像を描画するこのコードを、検討し、より大きなスケールで:私は完全なイメージを描いていると私は収穫しようとしていないよ

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); 
} 

注意それは決してそれを拡大するものではありません。

Painted example

お知らせ問題:

最後に、これはテストが私に与え出力はありますか?一番上の行と左の列のピクセルの半分が消えています。この上にグリッドを重ね合わせてみると、グリッドが正しく整列されているように見えますが、画像は正しく表示されません。サイズを64倍に増やしても、64はこの最初の行/列のトリミングを導入します。

注、私はまた、0,0の前に描いていただけの場合にはターゲット矩形を相殺しようとしたが、これはそうではありませんでした。

私はまた異なる補間モードを使用してみましたが、私の知る限りぼかしを誘発頭痛によって言うことができるよう、各画素は、まだトリミングされたので、私はそれを補間モードによるだとは思いません。

私はまた、別のグラフィックスモードを使用しようとしましたが、別に助けていないようでしたという事実から、私はとにかくピクセルに固執する必要があります。

私は好奇心から96DPIの画像の新しいコピーを再試行し、私はそれが元の画像の解像度はないと思うので、同じ効果を得ました。

Rectangleの代わりにRectangleFを使用してストローで挟み込むことも効果がありませんでした。

誰もがこの明らかな作物が発生している理由として任意の手がかりを提供することはできますか?

ありがとうございます。

答えて

7

PixelOffsetModePixelOffsetMode.Halfにデフォルトで設定されている:

は、高速アンチエイリアシングのために、垂直水平方向及び 、画素が±5つの単位によって相殺されることを指定します。

元の画像の半分のピクセルは、結果の画像の8ピクセルです。これは正確に欠けているものです。

PixelOffsetMode.Noneにそれを設定してみてください:ただのユーザーによって確認済みの回答をカバー

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

    e.Graphics.PixelOffsetMode = PixelOffsetMode.None; 
    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); 
} 
+6

ロテム、あなたの答えに感謝 - 私は、この特定のプロパティを認識していませんでした。私はそれをテストしましたが、それはまだ動作しませんでした。しかし、私はそれを 'HighQuality'に設定すると、イメージが正しくレンダリングされていることがわかりました。私にとって愚かなデフォルト値のように聞こえるが、あなたが知っていれば修正するのは簡単だ - もう一度感謝! –

+0

私は同じ問題を抱えていました。また、 'PixelOffsetMode'プロパティも認識していませんでした。繰り返しますが、 'PixelOffsetMode.None'は明白な設定であるにもかかわらず私のためには機能しませんでしたが、' PixelOffsetMode.HighQuality'が機能しました。 –

1

、私はそれを自分自身を試してみましたが、問題はその代わりPixelOffsetMode.HighQualitynoneで解決しました。

C#の

e.Graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; 

私の場合のC++の管理:

e->graphics->PixelOffsetMode = System::Drawing::Drawing2D::PixelOffsetMode::HighQuality; 
関連する問題