首页 > 解决方案 > 如何在 C# Winform 应用程序中的表单之间传递裁剪的图片?

问题描述

我正在使用 C# Windows 窗体中的联系人管理器桌面应用程序,我目前正在尝试添加头像图像裁剪功能。图像正在从一种形式传递到另一种形式,没有任何问题。但是,无论我在做什么,裁剪后的图像都不会传回登录表单。我试图通过重载构造函数并在裁剪图像时创建一个新对象来更改登录表单中的图片。但是,我收到这样的错误:

System.ArgumentOutOfRangeException: „参数必须为正且 < 高度。(参数'y')”</p>

异常发生在“颜色 pxlColor”行上。

创建裁剪图像的裁剪方法:

        private void button_Crop_Image_Click(object sender, EventArgs e)
        {
            Cursor = Cursors.Default;
            Bitmap bitmap2 = new Bitmap(pictureBox1.Width, pictureBox1.Height);
            pictureBox1.DrawToBitmap(bitmap2, pictureBox1.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);
                }
            }

            pictureBox2.Image = (Image)croppedImage;

            Login_Register_Form login = new Login_Register_Form(croppedImage);

            pictureBox2.SizeMode = PictureBoxSizeMode.StretchImage;
        }

图像正确显示在 pictureBox2.Image 字段上。来自登录表单的构造函数:

        public Login_Register_Form(Bitmap croppedImage)
        {
            this.croppedPicture = (Image)croppedImage;
            pictureBoxProfileImage.Image = this.croppedPicture;
        }

我已经对此进行了一些研究,发现上述错误可能是由于 Image 字段的大小不同造成的。在使它们的大小相等后,在“pictureBoxProfileImage.Image = this.croppedPicture;”上发生了 NullObjectReference 线。

System.NullReferenceException:“对象引用未设置为对象的实例。”</p>

我尝试同时传递 Bitmap 和 Image 变量,结果在两种情况下都是相似的。任何帮助将不胜感激。

干杯,菲利普

标签: c#winformscrop

解决方案


我重新安排了一些事情,现在都以一种形式提交。裁剪后的图像正在替换最初发布的图像,该图像通过以下方法发布:

    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);
        }
    }

问题是在保存图像以尝试使用以下功能进行注册时:

pictureBoxProfileImage.Image.Save(picture, pictureBoxProfileImage.Image.RawFormat);

图像为空,尽管显示正确。我应该以某种方式替换原始图像(覆盖)吗?


推荐阅读