0

我在 C# 中编写了一种裁剪图像的方法。它通过创建一个新的位图并在其上从原始图像中绘制一个指定的矩形(要裁剪的区域)来做到这一点。

对于我尝试过的图像,它会产生错误的结果。结果图像的大小是正确的,但内容就是它。就像图像被放大了 2 倍然后被裁剪。最终添加这一行修复了它:

result.setResolution(72, 72)

但为什么我需要一个解决方案?我只使用像素,从不使用英寸或厘米。另外,那么正确的分辨率是什么?

完整的代码是这个扩展方法:

public static Bitmap Crop(this Image image, int x, int y, int width, int height) {
    Bitmap result = new Bitmap(width, height);
    result.SetResolution(72, 72);

    // Use a graphics object to draw the resized image into the bitmap.
    using (Graphics graphics = Graphics.FromImage(result)) {
        // High quality.
        graphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
        graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
        graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
        // Draw the image into the target bitmap.
        graphics.DrawImage(image, 0, 0, new Rectangle(x, y, width, height), GraphicsUnit.Pixel);
    }

    return result;
}
4

2 回答 2

1

您正在使用不正确的 DrawImage 重载。您应该使用指定 Src 和 Dest rects 的那个。

graphics.DrawImage(image, new Rectangle(0, 0, width, height), new Rectangle(x, y, width, height), GraphicsUnit.Pixel);

试试看,如果它不起作用,请在评论中告诉我。

于 2009-07-30T13:53:23.473 回答
-1

我怀疑答案在于图书馆实际进行修改的方式。它只是在一些内存块周围复制和粘贴。分辨率指定每个像素使用的位/字节数。为了知道他需要复制多少字节,他需要知道每个像素使用了多少位/字节。

因此我认为这是一个简单的乘法,然后是一个内存副本。

问候

于 2009-07-30T06:59:00.437 回答