首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将图像裁剪并保存到图片框中-c#中

如何将图像裁剪并保存到图片框中-c#中
EN

Stack Overflow用户
提问于 2016-10-20 13:25:34
回答 2查看 1.9K关注 0票数 0

我无法裁剪图片框中的裸线模式,我尝试了几个星期,并决心得到一个解决方案。问题是,我的图像大小是说(1200,750),图片大小是(450,300),但是当我尝试在picturebox中任意裁剪它时,它采用图像原始大小的坐标(1200,750),但是我需要裁剪图像框(450,300)中显示的图像的坐标,因此在裁剪时会产生错误的结果。我正在使用c# winforms的visual 2013。请给我一个解决办法。提前谢谢你。

代码语言:javascript
复制
    private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
    {
        // Starting point of the selection:
        if (e.Button == MouseButtons.Left)
        {
            _selecting = true;
            _selection = new Rectangle(new Point(e.X, e.Y), new Size());
        }
    }

    private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
    {
        // Update the actual size of the selection:
        if (_selecting)
        {
            _selection.Width = e.X - _selection.X;
            _selection.Height = e.Y - _selection.Y;

            // Redraw the picturebox:
            pictureBox1.Refresh();
        }
    }

    private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
    {
        // Make a note that we "have the mouse". 
        bHaveMouse = true;

        // Store the "starting point" for this rubber-band rectangle. 
        ptOriginal.X = e.X;
        ptOriginal.Y = e.Y;

        // Special value lets us know that no previous 
        // rectangle needs to be erased. 

        // Display coordinates 
        //lbCordinates.Text = "Coordinates  :  " + e.X.ToString() + ", " + e.Y.ToString();

        //ptLast.X = -1;
        //ptLast.Y = -1;

        //rectCropArea = new Rectangle(new Point(e.X, e.Y), new Size()); 
        if (e.Button == MouseButtons.Left && _selecting)
        {
            // Create cropped image:
            Image img = pictureBox1.Image.Crop(_selection);

            // Fit image to the picturebox:
            pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
            pictureBox1.Image = img.Fit2PictureBox(pictureBox1);
            _selecting = false;
        }
        button5.Enabled = true;
    }

    private void pictureBox1_Paint(object sender, PaintEventArgs e)
    {
        if (_selecting)
        {
            // Draw a rectangle displaying the current selection
            Pen pen = Pens.GreenYellow;
            e.Graphics.DrawRectangle(pen, _selection);
        }
    }

我使用的命名空间类如下所示

代码语言:javascript
复制
namespace gfoidl.Imaging
{

    public static class ImageExtension
    {

        public static Image Crop(this Image image, Rectangle selection)
        {
            Bitmap bmp = image as Bitmap;

            // Check if it is a bitmap:
            if (bmp == null)
                throw new ArgumentException("Kein gültiges Bild (Bitmap)");

            // Crop the image:
            Bitmap cropBmp = bmp.Clone(selection, bmp.PixelFormat);

            // Release the resources:
            image.Dispose();

            return cropBmp;
        }

        public static Image Fit2PictureBox( this Image image, PictureBox picBox)
        {
            Bitmap bmp = null;
            Graphics g;

            // Scale:
            double scaleY = (double)image.Width / picBox.Width;
            double scaleX = (double)image.Height / picBox.Height;
            double scale = scaleY < scaleX ? scaleX : scaleY;

            // Create new bitmap:
            bmp = new Bitmap(
                (int)((double)image.Width / scale),
                (int)((double)image.Height / scale));

            // Set resolution of the new image:
            bmp.SetResolution(
                image.HorizontalResolution,
                image.VerticalResolution);

            // Create graphics:
            g = Graphics.FromImage(bmp);

            // Set interpolation mode:
            //g.InterpolationMode = InterpolationMode.HighQualityBicubic;

            // Draw the new image:

            g.DrawImage(
                image,
                new Rectangle(          // Ziel
                    0, 0,
                    bmp.Width, bmp.Height),
                new Rectangle(          // Quelle
                    0, 0,
                    image.Width, image.Height),
                GraphicsUnit.Pixel);
            picBox.SizeMode = PictureBoxSizeMode.StretchImage;

            // Release the resources of the graphics:
            g.Dispose();

            // Release the resources of the origin image:
            image.Dispose();

            return bmp;
        }
    }
}   //invoked it in the main program with the header using gfoid1.imaging;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-10-08 10:35:19

代码语言:javascript
复制
private Point mouseDown;

private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        _selecting = true;

        mouseDown = new Point(e.X, e.Y);
        _selection = new Rectangle(mouseDown, new Size());
    }
}

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
    if (_selecting)
    {
        Point mousePos = new Point(e.X, e.Y);

        if(mousePos.X < 0)
        {
            mousePos.X = 0;
        }

        if(mousePos.X >= pictureBox1.Width)
        {
            mousePos.X = pictureBox1.Width - 1;
        }

        if(mousePos.Y < 0)
        {
            mousePos.Y = 0;
        }

        if (mousePos.Y >= pictureBox1.Height)
        {
            mousePos.Y = pictureBox1.Height - 1;
        }


        _selection.X = Math.Min(mouseDown.X, mousePos.X);
        _selection.Y = Math.Min(mouseDown.Y, mousePos.Y);
        _selection.Width = Math.Abs(mousePos.X - mouseDown.X);
        _selection.Height = Math.Abs(mousePos.Y - mouseDown.Y);

        // Redraw the picturebox:
        pictureBox1.Invalidate();
    }
}
票数 0
EN

Stack Overflow用户

发布于 2016-10-21 20:53:26

如果你想在不留下纠察盒的情况下在各个方向做出适当的选择:

代码语言:javascript
复制
private Point mouseDown;

private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            _selecting = true;

            mouseDown = new Point(e.X, e.Y);
            _selection = new Rectangle(mouseDown, new Size());
        }
    }

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
    {
        if (_selecting)
        {
            Point mousePos = new Point(e.X, e.Y);

            if(mousePos.X < 0)
            {
                mousePos.X = 0;
            }

            if(mousePos.X >= pictureBox1.Width)
            {
                mousePos.X = pictureBox1.Width - 1;
            }

            if(mousePos.Y < 0)
            {
                mousePos.Y = 0;
            }

            if (mousePos.Y >= pictureBox1.Height)
            {
                mousePos.Y = pictureBox1.Height - 1;
            }


            _selection.X = Math.Min(mouseDown.X, mousePos.X);
            _selection.Y = Math.Min(mouseDown.Y, mousePos.Y);
            _selection.Width = Math.Abs(mousePos.X - mouseDown.X);
            _selection.Height = Math.Abs(mousePos.Y - mouseDown.Y);

            // Redraw the picturebox:
            pictureBox1.Invalidate();
        }
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40155783

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档