C#中的图像裁剪

时间:2012-01-03 13:29:03

标签: c# .net image-processing

我正在使用PictureBox来显示图片。我的图像直接来自扫描仪,因此分辨率高达4000 * 4000 ...因为我的显示区域要小得多,所以我必须用pictureBox1.SizeMode = PictureBoxSizeMode.Zoom;显示图像以保持宽高比。 之后,图像位于屏幕中间。

如何找到图像控件左侧与实际图像左侧的 REAL 之间的距离(参见下图)。

有没有解决方案?

顺便说一下。在屏幕左侧显示图像也可以解决问题。

        var imageHeight = pictureBox1.Image.Height;
        var imageWidth = pictureBox1.Image.Width;
        var userSelection = rect.Rect;

        var display = pictureBox1.DisplayRectangle;
        var xFactor = (float)userSelection.Width / display.Width;
        var yFactor = (float)userSelection.Height / display.Height;

        var realCropSizeWidth = xFactor * imageWidth;
        var realCropSizeHight = yFactor * imageHeight;

        var realCropX = imageWidth / display.Width;
        realCropX *= userSelection.X;
        var realCropY = imageHeight / display.Height;
        realCropY *= userSelection.Y;

        var realCropRectangle = new Rectangle(realCropX, realCropY, (int)realCropSizeWidth,
                                              (int)realCropSizeHight);

        var image = CropImage(pictureBox1.Image, realCropRectangle);
        pictureBox1.Image = image;

        public Image CropImage(Image source, Rectangle rectangle)
    {
        var target = new Bitmap(rectangle.Width, rectangle.Height);
        using (var g = Graphics.FromImage(target))
        {
            g.DrawImage(source, new Rectangle(0, 0, target.Width, target.Height),
                             rectangle,
                             GraphicsUnit.Pixel);
        }
        return target;
    }

1 个答案:

答案 0 :(得分:1)

据我所知,没有直接的方式来获得你想要的东西,但是一些简单的数学就足够了:

您知道保留的原始图像的宽高比,并且您知道正在显示它的图片框的宽高比。基于此,您可以确定图像的确切尺寸(高度或宽度)。一旦您知道可以获得图像的缩放系数,就可以计算出所显示图像的其他尺寸。

由于图像将以不完全适合图片框的尺寸为中心,因此它可以直接找到你想要的距离。