对不起,如果标题有点神秘.基本上我在ac#forms app中创建缩放控件,我的想法是我可以按因子缩放图像,即.1x,2x,4x,8x.我需要图像保持像素化,即.最近的邻居.缩放工作非常有效,除了当我使用边界像素选择Interp模式作为最近邻居时,它默认为内部颜色.这就是说外部像素看起来像内部像素的宽度的一半,问题实际上是当我添加一个工具提示来显示当前moused-over像素的x,y坐标时,它被抛出关闭.要清楚,它被抛弃的原因是因为我将当前像素计算为:
void m_pictureBox_MouseMove(object sender, MouseEventArgs e)
{
int x = e.Location.X / m_zoomFactor;
int y = e.Location.Y / m_zoomFactor;
}
Run Code Online (Sandbox Code Playgroud)
而且因为外部像素是宽度的一半......所以你得到了图片.
绘图代码很简单:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
图片控件托管在我的自定义"ZoomControl"中,它本身继承自"Panel"控件.
我的问题基本上是,任何正文可以帮助我解决边界像素问题,还有更好的方法来获得缩放功能吗?
您还需要更改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);
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1274 次 |
最近记录: |