如何在 C# 桌面应用程序中使用此图像的裁剪版本覆盖原始图像
How to overwrite original image with cropped version of this image in c# desktop application
我正在构建 C# 联系人管理器桌面应用程序,您可以在其中从文件中选择一个头像图像,然后再对其进行裁剪。裁剪后原图正常显示,替换原图。但是,稍后,在尝试注册帐户时,图像似乎为 Null,并显示这样的错误:
System.ArgumentNullException: „Value cannot be null. (Parameter
'encoder')”
上传图片到注册页面的方法:
private void button_browse_Click(object sender, EventArgs e)
{
// select and display image in the picturebox
OpenFileDialog opf = new OpenFileDialog();
opf.Filter = "Select Image(*.jpg;*.png;*.gif)|*.jpg;*.png;*.gif";
if(opf.ShowDialog() == DialogResult.OK)
{
pictureBoxProfileImage.Image = Image.FromFile(opf.FileName);
setImage(pictureBoxProfileImage.Image);
}
}
图片裁剪方法:
private void button_Select_Cropped_Area_Click(object sender, EventArgs e)
{
Cursor = Cursors.Default;
Bitmap bitmap2 = new Bitmap(pictureBoxProfileImage.Width, pictureBoxProfileImage.Height);
pictureBoxProfileImage.DrawToBitmap(bitmap2, pictureBoxProfileImage.ClientRectangle);
Bitmap croppedImage = new Bitmap(rectW, rectH);
for (int x = 0; x < rectW; x++)
{
for (int y = 0; y < rectH; y++)
{
Color pxlColor = bitmap2.GetPixel(cropX + x, cropY + y);
croppedImage.SetPixel(x, y, pxlColor);
}
}
pictureBoxProfileImage.Image.Dispose();
pictureBoxProfileImage.Image = (Image)croppedImage;
pictureBoxProfileImage.SizeMode = PictureBoxSizeMode.StretchImage;
}
这是保存图片时出错的行:
MemoryStream picture = new MemoryStream();
pictureBoxProfileImage.Image.Save(picture, pictureBoxProfileImage.Image.RawFormat);
值得一提的是,如果正在传递原始图像,则寄存器可以正常工作。我是否应该以某种方式替换它们(用裁剪的覆盖原始的)?
我的猜测是失败是由于 pictureBoxProfileImage.Image.RawFormat
。您刚刚替换了 pictureBoxProfileImage.Image
,但是 new Bitmap(...)
有什么原始格式?虽然我找不到任何关于它的文档,但我猜它根本没有任何有效的 rawFormat。
所以我会尝试用 ImageFormat.Png
之类的东西替换它,或者保存原始位图中的 rawFormat 以便在保存时使用。
我正在构建 C# 联系人管理器桌面应用程序,您可以在其中从文件中选择一个头像图像,然后再对其进行裁剪。裁剪后原图正常显示,替换原图。但是,稍后,在尝试注册帐户时,图像似乎为 Null,并显示这样的错误:
System.ArgumentNullException: „Value cannot be null. (Parameter 'encoder')”
上传图片到注册页面的方法:
private void button_browse_Click(object sender, EventArgs e)
{
// select and display image in the picturebox
OpenFileDialog opf = new OpenFileDialog();
opf.Filter = "Select Image(*.jpg;*.png;*.gif)|*.jpg;*.png;*.gif";
if(opf.ShowDialog() == DialogResult.OK)
{
pictureBoxProfileImage.Image = Image.FromFile(opf.FileName);
setImage(pictureBoxProfileImage.Image);
}
}
图片裁剪方法:
private void button_Select_Cropped_Area_Click(object sender, EventArgs e)
{
Cursor = Cursors.Default;
Bitmap bitmap2 = new Bitmap(pictureBoxProfileImage.Width, pictureBoxProfileImage.Height);
pictureBoxProfileImage.DrawToBitmap(bitmap2, pictureBoxProfileImage.ClientRectangle);
Bitmap croppedImage = new Bitmap(rectW, rectH);
for (int x = 0; x < rectW; x++)
{
for (int y = 0; y < rectH; y++)
{
Color pxlColor = bitmap2.GetPixel(cropX + x, cropY + y);
croppedImage.SetPixel(x, y, pxlColor);
}
}
pictureBoxProfileImage.Image.Dispose();
pictureBoxProfileImage.Image = (Image)croppedImage;
pictureBoxProfileImage.SizeMode = PictureBoxSizeMode.StretchImage;
}
这是保存图片时出错的行:
MemoryStream picture = new MemoryStream();
pictureBoxProfileImage.Image.Save(picture, pictureBoxProfileImage.Image.RawFormat);
值得一提的是,如果正在传递原始图像,则寄存器可以正常工作。我是否应该以某种方式替换它们(用裁剪的覆盖原始的)?
我的猜测是失败是由于 pictureBoxProfileImage.Image.RawFormat
。您刚刚替换了 pictureBoxProfileImage.Image
,但是 new Bitmap(...)
有什么原始格式?虽然我找不到任何关于它的文档,但我猜它根本没有任何有效的 rawFormat。
所以我会尝试用 ImageFormat.Png
之类的东西替换它,或者保存原始位图中的 rawFormat 以便在保存时使用。