Скопировать выделенную область в другой pictureBox
Всем привет! Я пытаюсь сделать следующее: в PictureBox пользователь с помощью мышки выделает область которая переносится в другой pictureBox.
У меня получился такой код:
Point p1;
Point p2;
bool isClicked = false;
private void mangaPicture_MouseDown(object sender, MouseEventArgs e)
{
p1 = new Point(e.Location.X, e.Location.Y);
isClicked = true;
}
private void mangaPicture_MouseUp(object sender, MouseEventArgs e)
{
p2 = new Point(e.Location.X, e.Location.Y);
isClicked = false;
//должно произойти перемещение в другой pictureBox
using (var bmp = new System.Drawing.Bitmap((int)GetRect(p1,p2).Width, (int)GetRect(p1, p2).Height))
{
using (var graphics = System.Drawing.Graphics.FromImage(bmp))
{
graphics.DrawImage(mangaPicture.Image, 0.0f, 0.0f, GetRect(p1,p2), System.Drawing.GraphicsUnit.Pixel); //строка о которой говорится ниже
}
pictureBox1.Image = bmp;
}
}
Rectangle GetRect(Point p1, Point p2)
{
var x1 = Math.Min(p1.X, p2.X);
var x2 = Math.Max(p1.X, p2.X);
var y1 = Math.Min(p1.Y, p2.Y);
var y2 = Math.Max(p1.Y, p2.Y);
return new Rectangle(x1, y1, x2 - x1, y2 - y1);
}
private void mangaPicture_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left && isClicked)
{
p2 = new Point(e.Location.X, e.Location.Y);
mangaPicture.Invalidate();
}
}
private void mangaPicture_Paint(object sender, PaintEventArgs e)
{
Pen blackPen = new Pen(Color.Black, 4);
e.Graphics.DrawRectangle(blackPen, GetRect(p1, p2));
blackPen.Dispose();
}
Код работает, но не совсем: он лишь выделяет область, а при выполнении строки, рядом с которой комментарий выдаёт ошибку: неправильный параметр, в чём может быть проблема?
UPD
У меня получилось сделать так, что бы картинка переносилась в другой pictureBox без ошибки MemoryOut:
private void mangaPicture_MouseUp(object sender, MouseEventArgs e)
{
p2 = new Point(e.Location.X, e.Location.Y);
isClicked = false;
Rectangle cloneRect = GetRect(p1, p2);
cloneRect.Intersect(new Rectangle(0, 0, mangaPicture.Width, mangaPicture.Height));
Bitmap bmp = new Bitmap(cloneRect.Width, cloneRect.Height);
using (Graphics gph = Graphics.FromImage(bmp))
{
gph.DrawImage(mangaPicture.Image, new Rectangle(0, 0, bmp.Width, bmp.Height), cloneRect, GraphicsUnit.Pixel);
}
pictureBox1.Image = bmp;
}
Но почему-то получившееся изображение не соответствует выделенному, прикрепил скриншот:
UPD2 У меня получилось реализовать то, что хотел:
private void mangaPicture_MouseUp(object sender, MouseEventArgs e)
{
p2 = new Point(e.Location.X, e.Location.Y);
if (e.Location.X >= mangaPicture.Width)
{
p2.X = mangaPicture.Width - 5;
}
if (e.Location.Y >= mangaPicture.Height)
{
p2.Y = mangaPicture.Height - 5;
}
if (e.Location.X <= 0)
{
p2.X = 5;
}
if (e.Location.Y <= 0)
{
p2.Y = 5;
}
isClicked = false;
Rectangle cloneRect = GetRect(p1, p2);
cloneRect.Intersect(new Rectangle(cloneRect.X, cloneRect.Y, mangaPicture.Width, mangaPicture.Height));
Image img = (Bitmap)CropImage(new Bitmap(mangaPicture.Image, mangaPicture.Size), cloneRect);
pictureBox1.Image = img;
}
private Image CropImage(Image img, Rectangle cropArea)
{
try
{
Bitmap bmpImage = new Bitmap(img);
Bitmap bmpCrop = bmpImage.Clone(cropArea /*your rectangle area*/, bmpImage.PixelFormat);
return (Image)(bmpCrop);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "CropImage()");
}
return null;
}
