2014-01-20 4 views
5

私はChip8エミュレータ/インタプリタを書いています。それは素晴らしいです。要するに、私はいくつかのゲームをプレイし、この悪いジャクソンを見るためのUIが必要です。私は最初、フレームバッファ(ビットマップ)を画面に描画するのが非常にぼやけていたという問題に直面しました。私が補間モードをNearest Neighborに設定する必要があると考えた後は、はるかに良く見えましたが、画像のエッジがクリップされているか、作業中の補間を誤解しているようです。ここにスクリーンショットがあります。画像のエッジをクリッピングする最近接フィルタリングを使用したグラフィックをwinforms

A screenshot of the issue. Note the edges.

あなたは、トップの周りに見エッジ、左、右を見てパターンを踏まえ、「全体」白画素で終わる必要があります。左上の問題を見るのが特に簡単で、白いピクセル全体が1つである必要があります。

スケールアップされている画像は64x32で、通常のグラフィックスのような、オブジェクトを使用して描かれている:「cpu.raster」はどこに(私はそれが面白いです知っている、64 * 6を無視する)

g.DrawImage (cpu.raster, 0, 0, 64 * 6, 32 * 6); 

エミュレータがゲームをレンダリングするビットマップ。私はコードの残りの部分を投稿したいが、それはすべてかなり標準的なようだ。でも、グラフィックスに関連する唯一の他のコードは、次のような設定されているモードを、平滑化/補間です:

 g = this.CreateGraphics(); 
     g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor; 
     g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.None; 
     this.DoubleBuffered = true; 

は、私はこれを防ぐために知っておくべきそこに別の設定ですか?描画された画像のサイズを縮小しようとしましたが、フォームが何らかの理由でクリップされていた可能性があると考えましたが、そうではありません。画像はスクリーンショットの端で終了します。あなたはInterpolationModeSmoothingModeを設定しているコードで

答えて

8

、この行を追加します。

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

あなたが描いているものの上部と左側を修正します。右側については、フォームがイメージを収容できるだけの幅を持っていることを確認してください。指定する幅は64 * 6 = 384ですが、スクリーンショットに表示されるフォームの表示領域は377ピクセルです。

+0

これは私のために、おかげです。私のフォームは正確に384ワイドに設定されていましたが、境界/ベゼルが含まれているように見えますか?ポイント0,0はフォーム領域の左上にありますが、境界線/ベゼルではピクセル384が実際には「オフスクリーン」であるようです。フォームを少し大きくした後、すべてが順番になります。 – ALLCAPS

+0

@ALLCAPS 'Size'の代わりに' ClientSize'を設定したいとします。残念ながら、デザイナで生成されたコードで実際に使用されているものの、デザイナでは使用できません。また、あなた自身の 'Control'を作って描画を扱うことも考えられます。それで対処するための煩わしい' ClientSize'はありません:描画を処理するために 'OnPaint'と' Invalidate'を使うことはできません。 CreateGraphicsを使って描画を強制的に行います。 – Luaan

関連する問題