如何通过矩形从pictureBox中剪切图片
How to cut picture from pictureBox by rectangle on it
我需要使用我在这个图片框中的矩形从图片框中剪切部分图片。现在我将图像加载到图片框(并将其缩放到图片框)并在图片框内绘制可调整大小的矩形,但我不知道如何通过该矩形剪切例如图片框的左下角。
编辑
Example
我需要用这个矩形切割轮子并将其保存为 jpeg
但是这个矩形不是静态的。
我不能完全确定我是否理解您的全部要求,但是您可以使用 BitMap 的克隆方法来裁剪图像。例如,这会在一个 pictureBox1 中裁剪图像并将其加载到 pictureBox2:
using (Bitmap bmp = new Bitmap(pictureBox1.Image))
{
var newImg = bmp.Clone(
new Rectangle { X = 10, Y = 10, Width = bmp.Width / 2, Height = bmp.Height / 2 },
bmp.PixelFormat);
pictureBox2.Image = newImg;
}
操作图像时很容易泄露句柄。您以后需要小心处理 pictureBox2.Image,尤其是当您多次重新加载图像时。
假设您可以创建矩形并对其进行处理(将其绘制在图片框上,计算其面积...):
private static 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;
}
private void saveJpeg(string path, Bitmap img, long quality)
{
EncoderParameter qualityParam = new EncoderParameter(
System.Drawing.Imaging.Encoder.Quality, (long)quality);
ImageCodecInfo jpegCodec = getEncoderInfo("image/jpeg");
if (jpegCodec == null)
{
MessageBox.Show("Can't find JPEG encoder?", "saveJpeg()");
return;
}
EncoderParameters encoderParams = new EncoderParameters(1);
encoderParams.Param[0] = qualityParam;
img.Save(path, jpegCodec, encoderParams);
}
private ImageCodecInfo getEncoderInfo(string mimeType)
{
ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();
for (int i = 0; i < codecs.Length; i++)
if (codecs[i].MimeType == mimeType)
return codecs[i];
return null;
}
private void btnPerformSaveImage_Click(object sender, EventArgs e)
{
try
{
Image img = (Bitmap)CropImage(new Bitmap(pictureBox1.Image, pictureBox1.Size), CropRect);
this.DialogResult = System.Windows.Forms.DialogResult.OK;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "btnOK_Click()");
}
}
我需要使用我在这个图片框中的矩形从图片框中剪切部分图片。现在我将图像加载到图片框(并将其缩放到图片框)并在图片框内绘制可调整大小的矩形,但我不知道如何通过该矩形剪切例如图片框的左下角。
编辑
Example 我需要用这个矩形切割轮子并将其保存为 jpeg 但是这个矩形不是静态的。
我不能完全确定我是否理解您的全部要求,但是您可以使用 BitMap 的克隆方法来裁剪图像。例如,这会在一个 pictureBox1 中裁剪图像并将其加载到 pictureBox2:
using (Bitmap bmp = new Bitmap(pictureBox1.Image))
{
var newImg = bmp.Clone(
new Rectangle { X = 10, Y = 10, Width = bmp.Width / 2, Height = bmp.Height / 2 },
bmp.PixelFormat);
pictureBox2.Image = newImg;
}
操作图像时很容易泄露句柄。您以后需要小心处理 pictureBox2.Image,尤其是当您多次重新加载图像时。
假设您可以创建矩形并对其进行处理(将其绘制在图片框上,计算其面积...):
private static 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;
}
private void saveJpeg(string path, Bitmap img, long quality)
{
EncoderParameter qualityParam = new EncoderParameter(
System.Drawing.Imaging.Encoder.Quality, (long)quality);
ImageCodecInfo jpegCodec = getEncoderInfo("image/jpeg");
if (jpegCodec == null)
{
MessageBox.Show("Can't find JPEG encoder?", "saveJpeg()");
return;
}
EncoderParameters encoderParams = new EncoderParameters(1);
encoderParams.Param[0] = qualityParam;
img.Save(path, jpegCodec, encoderParams);
}
private ImageCodecInfo getEncoderInfo(string mimeType)
{
ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();
for (int i = 0; i < codecs.Length; i++)
if (codecs[i].MimeType == mimeType)
return codecs[i];
return null;
}
private void btnPerformSaveImage_Click(object sender, EventArgs e)
{
try
{
Image img = (Bitmap)CropImage(new Bitmap(pictureBox1.Image, pictureBox1.Size), CropRect);
this.DialogResult = System.Windows.Forms.DialogResult.OK;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "btnOK_Click()");
}
}