Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Paint.exe样式缩放,最近邻插值对半边界像素_C#_Winforms_Zooming - Fatal编程技术网

C# Paint.exe样式缩放,最近邻插值对半边界像素

C# Paint.exe样式缩放,最近邻插值对半边界像素,c#,winforms,zooming,C#,Winforms,Zooming,抱歉,如果标题有点晦涩。基本上我是在c窗体应用程序中创建一个缩放控件,其思想是我可以按因子缩放图像,即1x、2x、4x、8x。我需要图像保持像素化,即最近的邻居。缩放效果非常好,除了当我在处理边界像素时选择Interp模式作为最近邻时,它默认为内部颜色。这就是说,外部像素的宽度似乎只有内部像素的一半,而真正的问题是当我添加工具提示以显示当前鼠标悬停像素的x,y坐标时。明确地说,它被抛出的原因是因为我将当前像素计算为: void m_pictureBox_MouseMove(object send

抱歉,如果标题有点晦涩。基本上我是在c窗体应用程序中创建一个缩放控件,其思想是我可以按因子缩放图像,即1x、2x、4x、8x。我需要图像保持像素化,即最近的邻居。缩放效果非常好,除了当我在处理边界像素时选择Interp模式作为最近邻时,它默认为内部颜色。这就是说,外部像素的宽度似乎只有内部像素的一半,而真正的问题是当我添加工具提示以显示当前鼠标悬停像素的x,y坐标时。明确地说,它被抛出的原因是因为我将当前像素计算为:

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”中,该控件本身从“Panel”控件继承


我的问题基本上是,任何机构都能帮助我解决边界像素问题吗?有没有更好的方法来获得缩放功能?

您还需要更改Graphics.PixelOffsetMode。它默认为“无”,这对于插值来说是可以的,但在将像素放大为块时则不行。把它改成一半。例如:

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

谢谢你们两位。我正要问同样的问题。编写问题比使用SO糟糕的搜索功能更好地找到问题已经解决的相关问题。