如何在C# Winform应用的不同窗体间传递裁剪后的图片
问题修复方案
1. System.ArgumentOutOfRangeException 错误修复
错误原因
你调用bitmap2.GetPixel(cropX + x, cropY + y)时,cropX + x超出了bitmap2的宽度,或cropY + y超出了bitmap2的高度,触发参数越界。大多由两个问题导致:
- 裁剪选区的坐标
cropX/cropY、尺寸rectW/rectH没有做边界校验,选区超出了原图片的范围 - 直接调用
pictureBox1.DrawToBitmap获取位图,没有考虑PictureBox的SizeMode缩放导致的控件尺寸和实际图片尺寸不一致的问题
修复代码
private void button_Crop_Image_Click(object sender, EventArgs e) { // 直接用原图处理,避免控件缩放导致的尺寸偏差 Bitmap originalBitmap = new Bitmap(pictureBox1.Image); // 先做边界校验,避免参数越界 cropX = Math.Max(0, cropX); cropY = Math.Max(0, cropY); rectW = Math.Min(rectW, originalBitmap.Width - cropX); rectH = Math.Min(rectH, originalBitmap.Height - cropY); Bitmap croppedImage = new Bitmap(rectW, rectH); for (int x = 0; x < rectW; x++) { for (int y = 0; y < rectH; y++) { Color pxlColor = originalBitmap.GetPixel(cropX + x, cropY + y); croppedImage.SetPixel(x, y, pxlColor); } } pictureBox2.SizeMode = PictureBoxSizeMode.StretchImage; pictureBox2.Image = croppedImage; // 注意:不要新创建登录窗体实例,要拿到已经打开的登录窗体的实例传递图片 // 假设原登录窗体实例存在公共静态字段或者你已经保存了实例引用,这里用已有的实例赋值 // 错误写法:Login_Register_Form login = new Login_Register_Form(croppedImage); // 正确写法示例(你需要根据自己的项目调整实例获取方式): Login_Register_Form.ExistingInstance.croppedPicture = croppedImage; Login_Register_Form.ExistingInstance.pictureBoxProfileImage.Image = croppedImage; }
2. System.NullReferenceException 错误修复
错误原因
你重载的Login_Register_Form构造函数没有调用默认的InitializeComponent()方法,窗体内的所有控件(包括pictureBoxProfileImage)都还没有完成初始化,直接赋值就会触发空引用。另外你新创建的登录窗体实例和你之前已经打开的登录窗口不是同一个对象,就算赋值成功也不会在原有窗口显示。
修复代码
// 重载构造函数加this()调用默认无参构造函数,默认构造函数里有InitializeComponent完成控件初始化 public Login_Register_Form(Bitmap croppedImage) : this() { this.croppedPicture = croppedImage; pictureBoxProfileImage.Image = this.croppedPicture; }
内容的提问来源于stack exchange,提问作者Filip
相关产品推荐
相关产品推荐

