2009-08-15 63 views
4

對不起,如果標題有點神祕。基本上我在c#表單應用中創建了一個縮放控件,這個想法是我可以通過一些因素縮放圖像,即。 1x,2x,4x,8x。我需要圖像保持像素化,即。最近的鄰居。縮放的效果非常好,只是當我選擇Interp模式作爲邊界像素時最近的鄰居時,它默認爲內部顏色。這就是說,外部像素看起來像內部像素寬度的一半,問題真的出現在我添加一個工具提示來顯示它所拋出的當前被掩蓋的像素的x,y座標時關閉。需要明確的是,它被揭去的原因是因爲我計算當前像素點爲:Paint.exe樣式縮放,NearestNeighNeighBour Interpolation halfing邊界像素

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可」,這本身就是從「面板」 Control繼承中託管。

我的問題是基本上,任何機構可以幫助我解決邊界像素問題,是否有更好的方法來獲得縮放功能?

回答

5

您還需要更改Graphics.PixelOffsetMode。它默認爲None,這對插值沒問題,但是當你將像素炸成塊時就不行。將其更改爲Half。例如:

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 2009-08-15 18:04:46

+0

謝謝你們倆。我正要問完全相同的問題。 *(寫出這個問題是一個更好的方式來找到一個問題已經解決的問題,而不是使用SO的窮人搜索功能。)* – Bitterblue 2013-12-19 10:58:10