Mik*_*ron 9 c# gdi+ image-manipulation
我正在使用GDI +(C#)进行一些图像缩放,并且已经注意到我正在缩放的图像沿着左边缘和顶边缘切割的问题.
要重现这一点,请创建一个新的表单项目,将此图像保存到bin\debug文件夹中,并将以下代码添加到表单(以及相应的事件):
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
}
int scale = 1;
Image img = Image.FromFile("circle.png");
private void Form1_Paint(object sender, PaintEventArgs e) {
//this makes the glitch easier to see
e.Graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor;
RectangleF srcRect = new RectangleF(0f, 0f, img.Width, img.Height);
RectangleF destRect = new RectangleF(0f, 0f, img.Width * scale, img.Height * scale);
e.Graphics.DrawImage(img, destRect, srcRect, GraphicsUnit.Pixel);
}
private void Form1_Click(object sender, EventArgs e) {
scale++;
if (scale > 8) scale = 1;
Invalidate();
}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,左侧和最顶部的像素行被截断,就像缩放矩形在像素的中途开始一样.
编辑:为了注意,我也尝试使用Scale变换而不是如上所述使用矩形,并且它呈现完全相同.
现在,说,我确实发现了一个解决方案.如果您更改上面示例中的矩形声明,如下所示:
RectangleF srcRect = new RectangleF(-0.5f, -0.5f, img.Width, img.Height);
Run Code Online (Sandbox Code Playgroud)
因此,我们纠正"中途"事物,然后图像正确呈现.
基本上,虽然这很容易解决,但我做错了什么,或者这是正常的行为?
编辑:根据Andrei Pana的建议,我尝试在绘图调用之前添加此代码:
e.Graphics.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.None;
Run Code Online (Sandbox Code Playgroud)
不幸的是,它并没有影响渲染.边缘仍被切断.
归档时间: |
|
查看次数: |
2069 次 |
最近记录: |