如何在 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 以便在保存时使用。