2009-08-15 11 views
4

タイトルが少しわかりにくい場合は申し訳ありません。基本的には、私はC#フォームアプリでズームコントロールを作成していますが、アイデアは画像をズームすることができます。 1x、2x、4x、8x。私は画像をピクセル化したままにする必要があります。最近隣人。ズームピクセルは、境界ピクセルを使用しているときに最も近いピクセルになるようにインターモードを選択すると、デフォルトで内部色になります。これは、外側のピクセルが内側のピクセルの半分の幅を持つように見えることです。問題が本当に出てくるのは、投げられた現在のマウスオーバーしたピクセルのx、y座標を表示するためのツールチップを追加するときですオフ。私は、現在のピクセルを計算するため、明確にするために、それはオフにスローされた理由は以下のとおりです。Paint.exeスタイルZoom、NearestNeighbour補間半分の境界ピクセル

void m_pictureBox_MouseMove(object sender, MouseEventArgs e) 
{ 
    int x = e.Location.X/m_zoomFactor; 
    int y = e.Location.Y/m_zoomFactor; 
} 

と外側のピクセルは半分の幅なので...よく、あなたは画像を取得します。

描画コードは単純です:

void m_pictureBox_Paint(object sender, PaintEventArgs e) 
{ 
    if (m_pictureBox.Image!=null) 
    { 
     e.Graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor; 
     e.Graphics.ScaleTransform((float)m_zoomFactor, (float)m_zoomFactor); 
     e.Graphics.DrawImage(m_pictureBox.Image, 0, 0); 
    }    
} 

ピクチャーコントロールが私のカスタム「パネル」コントロールから継承し、それ自体は「ZoomControl」内でホストされています。

私の質問は、基本的に、私は境界ピクセル問題を解決するのに役立つことができ、ズーム機能を得るためのより良い方法はありますか?

答えて

5

Graphics.PixelOffsetModeも変更する必要があります。デフォルトではNoneに設定されていますが、これは補間には問題ありませんが、ピクセルをブロックに吹き飛ばすときには使用できません。半分に変更してください。例:

public partial class Form1 : Form { 
    public Form1() { 
     InitializeComponent(); 
    } 

    private float mZoom = 10; 

    protected override void OnPaint(PaintEventArgs e) { 
     e.Graphics.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.Half; 
     e.Graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor; 
     Image img = Properties.Resources.SampleImage; 
     RectangleF rc = new RectangleF(0, 0, mZoom * img.Width, mZoom * img.Height); 
     e.Graphics.DrawImage(img, rc); 
    } 
    } 
+0

ありがとうございます。 – DeusAduro

+0

ありがとうございます。私はまったく同じ質問をしようとしていた。 *(質問を書くことは、SOの貧しい検索機能を使用するよりも、問題が既に解決されている関連する問題を見つける良い方法です)。* – Bitterblue

関連する問題