选择、剪切并用另一个区域替换图像的一个区域

本文关键字:区域 一个 图像 替换 选择 另一个 | 更新日期: 2023-09-27 18:28:03

我有一个图片框,并将图像导入此图片框。我想像"MS Paint中的自由形式选择"一样选择此图片框(图像)的一个区域,然后剪切所选区域,并用另一个图像或系统颜色替换(填充)此区域。

你对这个问题有什么想法?!

谢谢。

选择、剪切并用另一个区域替换图像的一个区域

我写了一个小的winform应用程序。这里有很多需要改进的地方,但它可以给你一些如何开始的建议。

我使用了三个图片框,一个是在没有更改的情况下显示图像,一个透明的图片框用于选择我想剪切的图像部分,另一个是可以粘贴图像部分的图片框。

主代码:

选择:

//I used a rectangle to "select" the part of image
Rectangle imageRegion = new Rectangle(clickedPointOne, pbImageRegion.Size); //clickedPointOne is the point of image where I start to select and pbImageRegion.Size is the size of the part of image.
//Then I cloned the part of image that I want
Image newImage = image.Clone(imageRegion, System.Drawing.Imaging.PixelFormat.Format32bppArgb);

剪切:

//I created a new bitmap with the size of the part of image that I selected
Bitmap bmp = new Bitmap(newImage.Width, newImage.Height);
Graphics g = Graphics.FromImage(bmp);
//So here I drawed in the bitmap a rectangle with the picturebox backcolor that rappresent the "blank" part of image
g.FillRectangle(new SolidBrush(mainPictureBox.BackColor), new Rectangle(new Point(0, 0), newImage.Size));
//Now draw the "blank" part on the main image
g = Graphics.FromImage(image);
g.DrawImage(bmp, clickedPointOne);

替换:(在我的应用程序中,您可以将图像的部分粘贴到第二个PictureBox中的任何位置)

//Get graphics from the picturebox image (where there could be another image)
Graphics g = Graphics.FromImage(secondPictureBox.Image);
//Draw the part of image
g.DrawImage(newImage, clickedPointTwo); //newImage is the part of image selected and cut, clickedPointTwo is the point of upper-left corner where you want to begin draw the image

整个代码:

private Bitmap image;
private Bitmap newImage;
private Rectangle imageRegion;
private PictureBox pbImageRegion;
private Point clickedPointOne;
private Point clickedPointTwo;
private bool allowMouseMove;
private bool clickedCutButton;
private bool firstClick;
public Form1()
{
    InitializeComponent();
    mainPictureBox.BackColor = Color.White;
    secondPictureBox.BackColor = Color.White;
}
private void loadImageButton_Click(object sender, EventArgs e)
{
    OpenFileDialog ofd = new OpenFileDialog();
    if (ofd.ShowDialog() == DialogResult.OK)
    {
        image = new Bitmap(ofd.FileName);
        mainPictureBox.Image = image;
        Bitmap bmp = new Bitmap(image.Width, image.Height);
        Graphics g = Graphics.FromImage(bmp);
        g.FillRectangle(new SolidBrush(Color.White), new Rectangle(new Point(0, 0), secondPictureBox.Size));
        secondPictureBox.Image = bmp;
    }
}
private void cutImageButton_Click(object sender, EventArgs e)
{
    firstClick = false;
    clickedCutButton = true;
    allowMouseMove = false;
    pbImageRegion = new PictureBox();
    pbImageRegion.BackColor = Color.Transparent;
    pbImageRegion.BorderStyle = BorderStyle.FixedSingle;
    pbImageRegion.Size = new Size(0, 0);
    pbImageRegion.MouseMove += new MouseEventHandler(pbImageRegion_MouseMove);
}
void pbImageRegion_MouseMove(object sender, MouseEventArgs e)
{
    if (allowMouseMove == true)
        pbImageRegion.Size = new Size(Math.Abs(e.X - clickedPointOne.X - 2), Math.Abs(e.Y - clickedPointOne.Y - 2));
}
private void mainPictureBox_MouseClick(object sender, MouseEventArgs e)
{
    if (clickedCutButton == true)
    {
        if (e.Button == MouseButtons.Left)
        {
            if (firstClick == false)
            {
                pbImageRegion.Location = new Point(e.X, e.Y);
                mainPictureBox.Controls.Add(pbImageRegion);
                clickedPointOne = new Point(e.X, e.Y);
                allowMouseMove = true;
                firstClick = true;
            }
            else
            {
                imageRegion = new Rectangle(clickedPointOne, pbImageRegion.Size);
                newImage = image.Clone(imageRegion, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
                allowMouseMove = false;
                mainPictureBox.Invalidate();
            }
        }
    }
}
private void mainPictureBox_MouseMove(object sender, MouseEventArgs e)
{
    //It works only from left to right
    if (allowMouseMove == true)
        pbImageRegion.Size = new Size(Math.Abs(e.X - clickedPointOne.X - 2), Math.Abs(e.Y - clickedPointOne.Y - 2));
}
private void secondPictureBox_MouseClick(object sender, MouseEventArgs e)
{
    if (clickedCutButton == true)
    {
        if (e.Button == MouseButtons.Left)
        {
            clickedCutButton = false;
            pbImageRegion.Size = new Size(0, 0);
            clickedPointTwo = new Point(e.X, e.Y);
            secondPictureBox.Invalidate();
        }
    }
}
private void secondPictureBox_Paint(object sender, PaintEventArgs e)
{
    if (newImage != null)
    {
        Graphics g = Graphics.FromImage(secondPictureBox.Image);
        g.DrawImage(newImage, clickedPointTwo);
        e.Graphics.DrawImage(secondPictureBox.Image, new Point(0, 0));
    }
}
private void mainPictureBox_Paint(object sender, PaintEventArgs e)
{
    if (newImage != null && allowMouseMove == false)
    {
        Bitmap bmp = new Bitmap(newImage.Width, newImage.Height);
        Graphics g = Graphics.FromImage(bmp);
        g.FillRectangle(new SolidBrush(mainPictureBox.BackColor), new Rectangle(new Point(0, 0), newImage.Size));
        g = Graphics.FromImage(image);
        g.DrawImage(bmp, clickedPointOne);
    }
}