【发布时间】:2015-11-08 14:20:50
【问题描述】:
我需要使用此图片框中的矩形从图片框中剪切部分图片。现在我将图像加载到图片框(并将其缩放到图片框)并在图片框内绘制可调整大小的矩形,但我不知道如何通过这个矩形切割例如图片框的左下角。
编辑
Example 我需要这个矩形的切割轮并将其保存为 jpeg 但这个矩形不是静态的。
【问题讨论】:
标签: c# winforms picturebox rectangles
我需要使用此图片框中的矩形从图片框中剪切部分图片。现在我将图像加载到图片框(并将其缩放到图片框)并在图片框内绘制可调整大小的矩形,但我不知道如何通过这个矩形切割例如图片框的左下角。
编辑
Example 我需要这个矩形的切割轮并将其保存为 jpeg 但这个矩形不是静态的。
【问题讨论】:
标签: c# winforms picturebox rectangles
我不完全确定我了解您的全部要求,但您可以使用 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,尤其是在您多次重新加载图像时。
【讨论】:
new Bitmap(Image, Size) 如果质量不重要。如需更复杂的大小调整,请查看this question。我建议将你的调整大小操作包装在它自己的函数中,并在调用 Save 之前应用它,因为确保每个函数都有一个目的是一种很好的做法。
假设你可以创建你的矩形并处理它(在你的图片框上绘制它,计算它的面积......):
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()");
}
}
【讨论】: