如何获取PictureBox图片源路径?及GDI+保存报错求助
解决PictureBox源路径获取与图片保存报错问题
咱们逐个拆解你的问题,给你落地的解决方案:
一、为什么获取图片源路径失败?
你当前的图片是从MySQL二进制流加载到PictureBox的,根本不存在C:\ABC\XYX\image.png这种本地源路径——因为PictureBox.ImageLocation属性只有通过本地文件路径(比如pictureBox.Load(@"C:\xxx\image.png"))加载图片时才会被赋值。从内存流创建的Bitmap不会携带任何原文件路径信息。
如果一定要拿到原始的本地路径,唯一可行的办法是:当初往MySQL存图片时,额外添加一个字段(比如IMAGE_PATH),把原图片的本地路径一起存入数据库。读取数据时同时读取这个字段的值,就能得到你想要的路径。
二、解决A generic error occurred in GDI+.报错
这个报错的核心原因是:你在using(MemoryStream stream)块内创建了Bitmap,但Bitmap对象会依赖这个内存流。当using块结束时,流被自动释放,此时PictureBox里的Image实际上是一个依赖已释放资源的Bitmap,调用Save时必然触发GDI+错误。
给你两个靠谱的解决办法:
办法1:复制Bitmap,断开与内存流的依赖
创建Bitmap后,复制一个独立的Bitmap实例,让新实例不依赖原内存流,即使流被释放也能正常使用:
using (MySqlDataReader dr = cmd.ExecuteReader()) { while (dr.Read()) { if (dr["IMAGE"] != DBNull.Value) { byte[] imageBytes = (byte[])dr["IMAGE"]; using (MemoryStream stream = new MemoryStream(imageBytes)) { // 从流创建临时Bitmap Bitmap tempBitmap = new Bitmap(stream); // 复制出独立的Bitmap,赋值给PictureBox pictureBox.Image = new Bitmap(tempBitmap); // 释放临时Bitmap tempBitmap.Dispose(); } } } }
之后再调用pictureBox.Image.Save("D:\\ImageOne.JPG", ImageFormat.Jpeg)就不会报错了。
办法2:保留原始二进制数据,保存时重新创建流
把读取到的图片二进制数据先存储起来,保存时用原始数据重新创建流和Bitmap,彻底避开依赖问题:
// 作为类的成员字段,方便后续调用 private byte[] _originalImageData; // 读取数据时 using (MySqlDataReader dr = cmd.ExecuteReader()) { while (dr.Read()) { if (dr["IMAGE"] != DBNull.Value) { _originalImageData = (byte[])dr["IMAGE"]; using (MemoryStream stream = new MemoryStream(_originalImageData)) { pictureBox.Image = new Bitmap(stream); } } } } // 保存图片时 if (_originalImageData != null) { using (MemoryStream saveStream = new MemoryStream(_originalImageData)) using (Bitmap saveBitmap = new Bitmap(saveStream)) { saveBitmap.Save("D:\\ImageOne.JPG", ImageFormat.Jpeg); } }
内容的提问来源于stack exchange,提问作者SDG69
相关产品推荐
相关产品推荐

