简体   繁体   English

如何调整裁剪图像的大小?

[英]How to resize a cropped image?

Goal:目标:

My current goal is to crop the original image from pictureBox1 and show it in pictureBox2 and increase it's size (Height & Width) by 0.8 .我目前的目标是从pictureBox1裁剪原始图像并将其显示在pictureBox2中并将其大小(高度和宽度)增加0.8

Current Code:当前代码:

//...
private Point LocationXY;
private Point LocationX1Y1;

private void button1_Click(object sender, EventArgs e)
{
    if (Clipboard.ContainsImage())
    {
        pictureBox1.Image?.Dispose();
        pictureBox1.Image = Clipboard.GetImage();
    }
}

private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
    if(e.Button == MouseButtons.Left)
        LocationXY = e.Location;
}

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        LocationX1Y1 = e.Location;
        pictureBox1.Invalidate();
    }
}

private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
    if(e.Button == MouseButtons.Left)
    {
        LocationX1Y1 = e.Location;

        pictureBox1.Invalidate();
        pictureBox2.Invalidate();
    }
}

private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
    if (MouseButtons == MouseButtons.Left)
        e.Graphics.DrawRectangle(Pens.Red, GetRect());
}

private void pictureBox2_Paint(object sender, PaintEventArgs e)
{
    var src = GetRect();

    if (src == Rectangle.Empty) return;

    var des = new Rectangle(0, 0, src.Width, src.Height);

    e.Graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
    e.Graphics.SmoothingMode = SmoothingMode.HighQuality;
    e.Graphics.CompositingQuality = CompositingQuality.HighQuality;

    e.Graphics.DrawImage(pictureBox1.Image,
        des, src, GraphicsUnit.Pixel);
}

private Rectangle GetRect()
{
    return new Rectangle(
        Math.Min(LocationXY.X, LocationX1Y1.X),
        Math.Min(LocationXY.Y, LocationX1Y1.Y),
        Math.Abs(LocationXY.X - LocationX1Y1.X),
        Math.Abs(LocationXY.Y - LocationX1Y1.Y)
        );
}
//...

Cropping the image:裁剪图像:

//...
private Bitmap GetCroppedImage()
{
    var src = GetRect();

    if (src == Rectangle.Empty) return null;

    var des = new Rectangle(0, 0, src.Width, src.Height);
    var b = new Bitmap(src.Width, src.Height);

    using (var g = Graphics.FromImage(b))
    {
        g.InterpolationMode = InterpolationMode.HighQualityBicubic;
        g.SmoothingMode = SmoothingMode.HighQuality;
        g.CompositingQuality = CompositingQuality.HighQuality;

        g.DrawImage(pictureBox1.Image, des, src, GraphicsUnit.Pixel);
    }
    return b;
}
//...

Current code - what does it do当前代码 - 它有什么作用

Currently this code is able to mark an red area in pictureBox1 and show the cropped image in pictureBox2 .目前,此代码能够在pictureBox2中标记一个红色区域并在pictureBox1中显示裁剪后的图像。

Question:问题:

How do I increase/resize the cropped image height and width by 0.8 ?如何将裁剪后的图像高度和宽度增加/调整大小0.8

Calculate the ratio of the scale up against the source size and use it to calculate the new size of the image.计算比例与源大小的比例,并使用它来计算图像的新大小。 Accordingly, the pictureBox2.Paint event code:因此, pictureBox2.Paint事件代码:

private void pictureBox2_Paint(object sender, PaintEventArgs e)
{
    var src = GetRect();

    if (src == Rectangle.Empty || src.Width == 0 || src.Height == 0) return;

    e.Graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
    e.Graphics.SmoothingMode = SmoothingMode.HighQuality;
    e.Graphics.CompositingQuality = CompositingQuality.HighQuality;

    var widthScale = 0.8;
    var heightScale = 0.8;
    var widthRatio = (src.Width * widthScale + src.Width) / src.Width;
    var heightRatio = (src.Height * heightScale + src.Height) / src.Height;
    var newWidth = (int)(src.Width * widthRatio);
    var newHeight = (int)(src.Height * heightRatio);
    var des = new Rectangle(0, 0, newWidth, newHeight);

    e.Graphics.DrawImage(pictureBox1.Image,
        des, src, GraphicsUnit.Pixel);
}

To apply that on the GetCroppedImage() function:要将其应用于GetCroppedImage() function:

private Image GetCroppedImage(double scale = 0)
{
    var src = GetRect();

    if (src == Rectangle.Empty || src.Width == 0 || src.Height == 0) return null;

    var widthRatio = (src.Width * scale + src.Width) / src.Width;
    var heightRatio = (src.Height * scale + src.Height) / src.Height;
    var newWidth = (int)(src.Width * widthRatio);
    var newHeight = (int)(src.Height * heightRatio);

    if (newWidth == 0 || newHeight == 0) return null;

    var des = new Rectangle(0, 0, newWidth, newHeight);
    var b = new Bitmap(newWidth, newHeight);

    using (var g = Graphics.FromImage(b))
    {
        g.InterpolationMode = InterpolationMode.HighQualityBicubic;
        g.SmoothingMode = SmoothingMode.HighQuality;
        g.CompositingQuality = CompositingQuality.HighQuality;
        g.DrawImage(pictureBox1.Image, des, src, GraphicsUnit.Pixel);
    }

    return b;
}

Also, you could use the Image.GetThumbnailImage to get small sizes from the main image.此外,您可以使用Image.GetThumbnailImage从主图像中获取小尺寸。 Not recommended if you need to return large ones.如果您需要退回大件,不推荐。 Read the Remarks for more information.阅读备注了解更多信息。

public static Bitmap ResizeImage(System.Drawing.Image image, int width, int height)
{
    var destRect = new Rectangle(0, 0, width, height);
    var destImage = new Bitmap(width, height);

    destImage.SetResolution(image.HorizontalResolution, image.VerticalResolution);

    using (var graphics = Graphics.FromImage(destImage))
    {
        graphics.CompositingMode = CompositingMode.SourceCopy;
        graphics.CompositingQuality = CompositingQuality.HighQuality;
        graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
        graphics.SmoothingMode = SmoothingMode.HighQuality;
        graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;

        using (var wrapMode = new ImageAttributes())
        {
            wrapMode.SetWrapMode(WrapMode.TileFlipXY);
            graphics.DrawImage(image, destRect, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, wrapMode);
        }
    }

    return destImage;
}

Usage:用法:

ResizeImage(originalImg, (int)(originalImg.Width * 0.8), (int)(originalImg.Height * 0.8));

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM