我遵循了YouTube教程,了解如何创建裁剪图像应用程序。
目标:
我的目标只是将屏幕截图图像加载到parking.observe(this, new Observer<List<Parking>>() {
@Override
public void onChanged(@Nullable List<Parking> parking){
}
});
中。
然后用红色矩形标记要裁剪的区域并显示到PictureBox1
中。
以下是代码:
PictureBox2
输出:
这是输出输出:
在左侧-您可以看到屏幕截图输入,而在右侧-您可以看到裁剪的图像。
我不明白-红色标记的矩形不能正确裁剪图像? -它显示了屏幕截图图像的不同区域。
哪里出了问题?
答案 0 :(得分:4)
在Graphics
的{{1}}事件中,使用一次性Bitmap
和MouseUp
对象的内存代替{em> flooding ,而处理{{1 }}事件,并使用受支持的PictureBox1
对象进行绘制,只需使用Paint
重载来传递源矩形和目标矩形。
PictureBox2
使用以下命令获取裁剪的图像:
Graphics
然后您可以将其保存为:
e.Graphics.DrawImage
答案 1 :(得分:0)
将SizeMode设置为Normal可能无法使用以下代码裁剪图像
//...
private Bitmap GetCroppedImage()
{
var src = GetRect();
if (src == Rectangle.Empty) return null;
var des = new Rectangle(0, 0, src.Width, src.Height);
var b = new Bitmap(src.Width, src.Height);
using (var g = Graphics.FromImage(b))
{
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.SmoothingMode = SmoothingMode.HighQuality;
g.CompositingQuality = CompositingQuality.HighQuality;
g.DrawImage(pictureBox1.Image, des, src, GraphicsUnit.Pixel);
}
return b;
}
//...
裁剪将相对于Picturebox的宽度和高度。
将新的位图行更改为以下
private void Save()
{
using (var d = new SaveFileDialog())
{
d.Filter = "PNG|*.png|JPEG|*.jpeg;*.jpg|BMP|*.bmp";
if (d.ShowDialog() != DialogResult.OK) return;
using (var b = GetCroppedImage())
{
if (b == null) return;
ImageFormat f;
switch (d.FilterIndex)
{
case 2:
f = ImageFormat.Jpeg;
break;
case 3:
f = ImageFormat.Bmp;
break;
default:
f = ImageFormat.Png;
break;
}
b.Save(d.FileName, f);
}
}
}
或将图片框的SizeMode设置为StretchImage
=INDEX(COUNTIFS(Database!C:C; TRUE; LEN(Database!B:B); 17))