正确使用图形。具有指定点的矩形c#winforms

正确使用图形。具有指定点的矩形c#winforms,c#,winforms,system.drawing,bitmapimage,C#,Winforms,System.drawing,Bitmapimage,我试图获得扫描文档每个角落的图像(左上和右下,左下和右下)。下面是我如何尝试实现的,但当我查看保存的图像时,它们都是不同的部分,但只是左上角,而不是整个文档。对我如何改变这一点有什么建议吗 Bitmap result = fullImg; //top-left var bandImg1 = result.Clone(new System.Drawing.Rectangle(0, 0, 375, 375), fullImg.PixelFormat); //top-right var ba

我试图获得扫描文档每个角落的图像(左上和右下,左下和右下)。下面是我如何尝试实现的,但当我查看保存的图像时,它们都是不同的部分,但只是左上角,而不是整个文档。对我如何改变这一点有什么建议吗

 Bitmap result = fullImg;
 //top-left
 var bandImg1 = result.Clone(new System.Drawing.Rectangle(0, 0, 375, 375), fullImg.PixelFormat);
 //top-right
 var bandImg2 = result.Clone(new System.Drawing.Rectangle(100, 50, 375, 375), fullImg.PixelFormat);
 //bottom-left
 var bandImg3 = result.Clone(new System.Drawing.Rectangle(0, 50, 375, 375), fullImg.PixelFormat);
 //bottom-right
 var bandImg4 = result.Clone(new System.Drawing.Rectangle(100, 100, 375, 375), fullImg.PixelFormat);

                    bandImg1.Save("c:\\bandImg1.gif", System.Drawing.Imaging.ImageFormat.Gif);
                    bandImg2.Save("c:\\bandImg2.gif", System.Drawing.Imaging.ImageFormat.Gif);
                    bandImg3.Save("c:\\bandImg3.gif", System.Drawing.Imaging.ImageFormat.Gif);
                    bandImg4.Save("c:\\bandImg4.gif", System.Drawing.Imaging.ImageFormat.Gif);
----根据下面的答案更新代码并添加内容---

Bitmap result = fullImg;
                    //top-left
                    var bandImg1 = result.Clone(new System.Drawing.Rectangle(0, 0, result.Width/2, result.Height/2), fullImg.PixelFormat);
                    //top-right
                    var bandImg2 = result.Clone(new System.Drawing.Rectangle(result.Width / 2, 0, result.Width / 2, result.Height / 2), fullImg.PixelFormat);
                    //bottom-left
                    var bandImg3 = result.Clone(new System.Drawing.Rectangle(0, result.Height / 2, result.Width / 2, result.Height / 2), fullImg.PixelFormat);
                    //bottom-right
                    var bandImg4 = result.Clone(new System.Drawing.Rectangle(result.Width / 2, result.Height / 2, result.Width / 2, result.Height / 2), fullImg.PixelFormat);

                    bandImg1.Save("c:\\bandImg1.gif", System.Drawing.Imaging.ImageFormat.Gif);
                    bandImg2.Save("c:\\bandImg2.gif", System.Drawing.Imaging.ImageFormat.Gif);
                    bandImg3.Save("c:\\bandImg3.gif", System.Drawing.Imaging.ImageFormat.Gif);
                    bandImg4.Save("c:\\bandImg4.gif", System.Drawing.Imaging.ImageFormat.Gif);


                    string QRinfo = Process(bandImg1);
处理方法:

public string Process(Bitmap bitmap)
    {
        var reader = new com.google.zxing.qrcode.QRCodeReader();

        try
        {
            LuminanceSource source = new RGBLuminanceSource(bitmap, bitmap.Width, bitmap.Height);
            var binarizer = new HybridBinarizer(source);
            var binBitmap = new BinaryBitmap(binarizer);
            return reader.decode(binBitmap).Text;
        }
        catch (Exception e)
        {
            return e.Message;
        }
    }

我的猜测是,在计算矩形坐标时,您需要考虑
result
fullImg
的宽度和高度,而不是像您这样硬编码值。大概是这样的:

//top left
var bandImg1 = result.Clone(new Rectangle(0, 0, result.Width / 2, result.Height / 2), result.PixelFormat);
//top right
var bandImg2 = result.Clone(new Rectangle(result.Width / 2, 0, result.Width / 2, result.Height / 2), result.PixelFormat);
//bottom left
var bandImg3 = result.Clone(new Rectangle(0, result.Height / 2, result.Width / 2, result.Height / 2), result.PixelFormat);
//bottom right
var bandImg4 = result.Clone(new Rectangle(result.Width / 2, result.Height / 2, result.Width / 2, result.Height / 2), result.PixelFormat);

您现在所做的可能不起作用,因为您正在对值进行硬编码。例如,对于
bandImg1
您正在使用
(0,0375375)
作为矩形,该矩形基本上表示“从左上角开始,向右移动375像素,向下移动375像素”。相反,您需要使用
(0,0,result.Width/2,result.Height/2)
,它说“从左上角开始,穿过图像的一半,然后沿着图像的一半”,这将为您提供左上角。

我的猜测是,您需要获取
result
的宽度和高度,或者在计算矩形坐标时考虑
fullImg
,而不是像您这样硬编码值。大概是这样的:

//top left
var bandImg1 = result.Clone(new Rectangle(0, 0, result.Width / 2, result.Height / 2), result.PixelFormat);
//top right
var bandImg2 = result.Clone(new Rectangle(result.Width / 2, 0, result.Width / 2, result.Height / 2), result.PixelFormat);
//bottom left
var bandImg3 = result.Clone(new Rectangle(0, result.Height / 2, result.Width / 2, result.Height / 2), result.PixelFormat);
//bottom right
var bandImg4 = result.Clone(new Rectangle(result.Width / 2, result.Height / 2, result.Width / 2, result.Height / 2), result.PixelFormat);


您现在所做的可能不起作用,因为您正在对值进行硬编码。例如,对于
bandImg1
您正在使用
(0,0375375)
作为矩形,该矩形基本上表示“从左上角开始,向右移动375像素,向下移动375像素”。相反,您希望使用
(0,0,result.Width/2,result.Height/2)
,它表示“从左上角开始,在图像上走一半,然后在图像上走一半”,这将为您提供左上角。

使用位图
Width
Height
属性,而不是硬编码的数字。@sparky68967当我使用页面宽度和高度时,我会收到内存不足的消息。我想获得每个角的特定大小,但我的点是否正确?我认为你的思路正确,但硬编码点是个坏主意。您应该发布导致异常的代码。确保您获得整个文档的唯一方法是使用宽度和高度来计算角。@sparky68967是否有您所指的示例?我没有发现任何错误,但当我查看图像时,它们都位于上角,但略有偏移。我发布了一个答案,解释了我的意思。使用位图
Width
Height
属性,而不是硬编码的数字。@sparky68967当我使用页面宽度和高度时,我会收到一条内存不足的消息。我想获得每个角的特定大小,但我的点是否正确?我认为你的思路正确,但硬编码点是个坏主意。您应该发布导致异常的代码。确保您获得整个文档的唯一方法是使用宽度和高度来计算角。@sparky68967是否有您所指的示例?我没有得到一个错误,但当我看这些图片时,它们都在上角,但有一点移动。我发布了一个答案解释我的意思。谢谢,这是有效的!我没有正确地改变x和y。谢谢你的帮助。你是否也知道一种方法,我可以搜索整个文档,看看哪个角落有基于我上面的图像?因此,我试图做的是,我收到一个扫描pdf,其中有一个二维码。我想找到qr图像的位置(四个角中的一个),以便旋转pdf,使qr位于左上角。@Amina听起来很有趣。我本想告诉你开始一个新问题,但现在我看到你已经有一个问题要问了。我会看一看,但我没有在图像中搜索图像的经验。我已经可以搜索图像并提取二维码,但我的问题是,我想有一个干净的方法来检查哪个角落有图像,是否在if-else语句的for循环中。谢谢你的帮助-我一直在尝试获取信息,但没有找到太多相关信息。@Amina那么,有了这个问题中的新代码,你能确定哪个bandImg有二维码吗?谢谢,这很有效!我没有正确地改变x和y。谢谢你的帮助。你是否也知道一种方法,我可以搜索整个文档,看看哪个角落有基于我上面的图像?因此,我试图做的是,我收到一个扫描pdf,其中有一个二维码。我想找到qr图像的位置(四个角中的一个),以便旋转pdf,使qr位于左上角。@Amina听起来很有趣。我本想告诉你开始一个新问题,但现在我看到你已经有一个问题要问了。我会看一看,但我没有在图像中搜索图像的经验。我已经可以搜索图像并提取二维码,但我的问题是,我想有一个干净的方法来检查哪个角落有图像,是否在if-else语句的for循环中。谢谢你的帮助-我一直在试图获取信息,但没有找到太多关于这方面的信息。@Amina那么有了这个问题中的新代码,你能确定哪个bandImg有二维码吗?