C# 为什么需要指定裁剪的分辨率?

C# 为什么需要指定裁剪的分辨率?,c#,.net,image,resolution,crop,C#,.net,Image,Resolution,Crop,我在C语言中编写了一个裁剪图像的方法。它通过创建一个新的位图并在其上绘制一个指定的矩形,该矩形是从原始图像裁剪的区域 对于我尝试过的图像,它产生了错误的结果。结果图像的大小是正确的,但内容是正确的。这就像是将图像放大了2倍,然后进行了裁剪。最后添加这一行修复了它: result.setResolution(72, 72) 但为什么我需要一个决议?我只是处理像素,而不是英寸或厘米。另外,正确的解决方案是什么 此扩展方法的完整代码如下所示: public static Bitmap Crop(th

我在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;
}

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

因此,我认为这是一个简单的乘法,后跟一个memcopy


关于

您使用的DrawImage重载不正确。 您应该使用指定Src和Dest rect的方法

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

试试看,如果不行,请在评论中告诉我。

图像的格式不应该定义每个像素多少字节吗?是RGB吗?RGBA?它们是整数、多头还是浮动?然后复制我告诉它的像素。是的,是的。但该格式只有如何存储数据的信息。根据格式的不同,可能分辨率是可变的,因此格式无法准确地知道分辨率。我想浮动不适用。它是什么类型的格式?还是未知?如果忽略行结果会发生什么情况。SetResolution72,72;Regard我认为视频卡使用带浮点数的RGBA。如果我忽略分辨率,比如说,我用crop0,0,100,100得到一张100乘100的图像,一张大约60乘60的原始图片被拉伸。