2010-12-10 8 views
4

私は1px幅で、ある程度の高さの画像を持っています。このイメージをOnPaintイベントのコントロールの幅全体に描画する必要があります。私は描くことができますが、正しくはありません。それが伸びているように見えますが、実際にはすべてのピクセルを塗りつぶすわけではありません。あたかも補間がオフであるかのように。 「スマートではなくて、ただそれを描く」と言う方法はありますか?グラフィックスオブジェクトのオプションにInterpolationMode.Offまたは.Noneは表示されません。c#Graphicsに画像を描画(スケーリング)し、正しく補間しません。修正?

実際には幅Xの画像を使用して、実際には全幅を描画していることを確認できます.Xはコントロールと同じ幅です。それが描画されるとき、それは通常どおり完全な領域をカバーします。しかし、このコントロールは常にサイズが変更されており、メモリーを節約するために、1pxの幅の画像を使用するジャズはウェブ世界では非常に正常です。これは、デスクトップC#アプリケーションです。どのようにこれを修正するための任意のアイデア?

答えて

9

は、[OK]を私は魔法のキーワードを考え出しました。

補間モードを設定しないと、奇妙なブレンド(予想)が発生します。 PixelOffsetModeを設定しないと、最近傍アルゴリズムは空白のペイント上で比較する隣接物を持たないため、画像の半分だけを幅の半分だけ描画します。これを半分にオフセットするように設定すると、すべてを-0.5pxだけ移動し、このアルゴリズムでブロックテクスチャを処理できます。

+2

私は同じ問題を抱えていて、PixelOffsetModeとInterpolationModeのいくつかのバリエーションを試した後、これが私にとってうまくいきました。 Googleで検索する場合:PixelOffsetModeをHalfに設定すると、graphics.DrawImage(...)はエイリアシングなしで画像をサイズ変更し(MS Paintのように)、指定したサイズ/長方形を塗りつぶします。 アーティファクト/ブレンディングを気にせず(1つの単色であるため、存在しないため)、単一のカラーイメージ/パターンをオーバーレイしたい場合には、これが適しています。 – Andrew

0

この場合、InterpolationMode.NearestNeighborを使用します。完全なブロックを描画するために可能に

g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.Half; 

これはNearestNeighbourに補間モードを設定することと相まって:

+0

これを試してみましたが、これはちょうど1/2の幅のビットマップを返します。他のモードでは途中から透明度が変わりますが、InterpolationMode.NearestNeighborは0.5 * wanted_widthしか描画しません。 – Nick

+0

これは当てはまりません。コード内の別の場所で問題になるはずです。私は確かに自分でテストしました。補間モードは描画される画像の幅とは関係ありません。 –

+0

他に何も描画されていない場合は、これが実行されます。私の答えは下記をチェックしてください。それはPixelOffsetと関係があります。簡単に再現可能です。任意のコントロールを取得し、OnPaintイベントをオーバーライドし、1ピクセルの幅の画像を全幅に描画すると、幅は50%になります。 PixelOffsetを設定すると、100%が表示されます。これはVisual Studio 2010で、.NET 4.0は多くのさまざまなコントロールで動作し、すべて同じように動作します。 – Nick

関連する問題