裁剪图像C#失真

裁剪图像C#失真,c#,image,C#,Image,我正试图用C#裁剪图像,但我遇到了一些问题 我需要裁剪此图像并从顶部删除15个像素: 我使用了以下代码: Bitmap myBitmap = new Bitmap(outputFileName); Rectangle destRectangle = new Rectangle(new Point(0, 15), new Size(myBitmap.Width, myBitmap.Height)); Bitmap bmp = new Bitmap(myBitmap.Width, myBitmap.

我正试图用C#裁剪图像,但我遇到了一些问题

我需要裁剪此图像并从顶部删除15个像素:

我使用了以下代码:

Bitmap myBitmap = new Bitmap(outputFileName);
Rectangle destRectangle = new Rectangle(new Point(0, 15),
new Size(myBitmap.Width, myBitmap.Height));
Bitmap bmp = new Bitmap(myBitmap.Width, myBitmap.Height - 15);
Graphics g = Graphics.FromImage(bmp);
g.DrawImage(myBitmap, 0, 0, destRectangle, GraphicsUnit.Pixel);
bmp.Save(outputFileNameCut, ImageFormat.Png);
这是第一个具有缩放的图像质量:

这是第二个:

如何才能获得相同的图像质量?

尝试使用framework。它可以使用.Quality()方法轻松处理此问题。

尝试使用framework。它可以使用.Quality()方法轻松处理此问题。

尝试粘贴

g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.None;
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor;
在调用DrawImage之前

或使用

g.DrawImageUnscaled(myBitmap, new Point(0, -15));
尝试粘贴

g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.None;
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor;
在调用DrawImage之前

或使用

g.DrawImageUnscaled(myBitmap, new Point(0, -15));

问题是,您抓取的矩形比位图中适合的矩形高(第二个
Size
参数是大小,而不是右下角的坐标),因此它正在缩放它:

Rectangle destRectangle = new Rectangle(
       new Point(0, 15), new Size(myBitmap.Width, myBitmap.Height-15));
这应该有用。。。因为它实际上不是
dest
矩形,而是
DrawImage
调用上的
source
矩形

甚至不需要
图形
对象的其他裁剪方法可能是:

Bitmap myBitmap = new Bitmap(outputFileName);
Rectangle srcRectangle = new Rectangle(
       new Point(0, 15), new Size(myBitmap.Width, myBitmap.Height-15));
Bitmap croppedBitmap = myBitmap.Clone(srcRectangle, myBitmap.PixelFormat);
croppedBitmap.Save(outputFileNameCut, ImageFormat.Png);

如果使用此方法,请100%确保裁剪矩形没有超出原始图像的边界,因为如果超出边界,克隆将引发异常。

问题在于,您正在捕获的矩形高于位图中的矩形(第二个
Size
参数是大小,而不是右下角的坐标),因此它正在缩放它:

Rectangle destRectangle = new Rectangle(
       new Point(0, 15), new Size(myBitmap.Width, myBitmap.Height-15));
这应该可以…因为它实际上不是
dest
矩形,而是
DrawImage
调用上的
source
矩形

甚至不需要
图形
对象的其他裁剪方法可能是:

Bitmap myBitmap = new Bitmap(outputFileName);
Rectangle srcRectangle = new Rectangle(
       new Point(0, 15), new Size(myBitmap.Width, myBitmap.Height-15));
Bitmap croppedBitmap = myBitmap.Clone(srcRectangle, myBitmap.PixelFormat);
croppedBitmap.Save(outputFileNameCut, ImageFormat.Png);

如果使用此方法,请100%确保裁剪矩形不会跨越原始图像的边界,因为如果它跨越原始图像的边界,
Clone
将引发异常。

这很完美。非常感谢!虽然这两种方法都有效,但我认为第二种方法更有意义。更改插值模式和平滑将避免锯齿ng,但问题是先按比例绘制,这是不必要的,这是完美的。非常感谢!虽然两种方法都有效,但我认为第二种方法更有意义。更改插值模式和平滑将避免锯齿,但问题是先按比例绘制,这是不必要的