选择,剪切和替换另一个图像区域

时间:2012-03-17 13:41:51

标签: c# image select

我有一个图片框并将图像导入到此图片框中。我想选择这个图片框(图像)的区域,如“MS Paint中的自由格式选择”,然后剪切选定的区域,并用另一个图像或系统颜色替换(填充)该区域。

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

感谢。

1 个答案:

答案 0 :(得分:2)

我写了一个小的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);

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

//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);
    }
}