使用带有内存流的 c# 在控制台应用程序中保存图像时,GDI + 中发生一般错误

Posted

技术标签:

【中文标题】使用带有内存流的 c# 在控制台应用程序中保存图像时,GDI + 中发生一般错误【英文标题】:A Generic error occured in GDI + while saving image in console application using c# with memory stream 【发布时间】:2012-10-19 14:27:01 【问题描述】:

当我尝试在 c# 中使用 memorystream 保存图像时,出现下面提到的错误。仅当字节数组 byteImageData 长度等于 24000 时才会引发错误,否则代码工作正常。下面是代码sn-p:

string strDbConn = string.Empty;
string strImageFileName = string.Empty;
string strImageData = string.Empty;
DataSet imageDS = new DataSet();
Byte[] byteImageData = new Byte[0];
Image saveImage;
string strImgSavePath = string.Empty;
try

    //---open the database connection
    strDbConn = ConfigurationSettings.AppSettings["DBConnection"].ToString().Trim();
    SqlConnection dbcon = new SqlConnection(strDbConn);
    dbcon.Open();
    SqlDataAdapter imageSqlDataAdapter = new SqlDataAdapter("select * from image_data", dbcon);
    imageSqlDataAdapter.Fill(imageDS);
    dbcon.Close();
    for (int i = 0; i < imageDS.Tables[0].Rows.Count; i++)
    
        strImageFileName = imageDS.Tables[0].Rows[i]["name"].ToString().Trim();
        strImageData = imageDS.Tables[0].Rows[i]["signature_vod__c"].ToString().Trim();
        //converting string to byte array
        byteImageData = Convert.FromBase64String(strImageData);
        //---create Memory stremm from the Image Byte data
        MemoryStream stmImageData = new MemoryStream(byteImageData);
        //--saving the image
        saveImage = Image.FromStream(stmImageData);
        strImgSavePath = ConfigurationSettings.AppSettings["ImageSavePath"].ToString().Trim();
        saveImage.Save(strImgSavePath + strImageFileName + ".jpeg"); // error comes here
        //stmImageData.Close();
    

catch (Exception ex)



抛出的错误是:

Messgae = A generic error occurred in GDI+. 
Inner Exception = null 

堆栈跟踪:

at System.Drawing.Image.Save(String filename, ImageCodecInfo encoder, EncoderParameters encoderParams)
   at System.Drawing.Image.Save(String filename, ImageFormat format)
   at System.Drawing.Image.Save(String filename)
   at VeevaImageApp.Program.CreateAndSaveImageusingDataSet2() in Program.cs:line 141

仅当字节数组 byteImageData 长度为 24000 时才会出现错误,否则代码工作文件 - 可能是什么问题,我该如何解决?

【问题讨论】:

您确定图像数据正确吗?如果将二进制数据保存到名为 test.jpeg 的文件中,它是否呈现正常? 您是否有权写入要保存到的位置? weblogs.asp.net/anasghanem/archive/2009/02/28/… 在数据集中我有 5000 张图像,它可以工作文件直到 509 张图像,之后当我得到第 510 个图像字节数组长度达到 24000 时,它给了我错误 是的,我有写入位置的权限,代码可以写入 509 张图像,但是当 byteImageData 长度为 24000 时出现错误 不是在循环之前声明byteImageData,而是在转换strImageData时尝试使用隐式声明,例如var byteImageData = Convert.FromBase64String(strImageData); 【参考方案1】:

图像数据是什么格式的?如果它已经是 JPG,你应该使用File.WriteAllBytes(path, byteImageData)。如果你真的需要转换,你应该使用更新的图像编码器/解码器类:在网上搜索 JpegBitmapEncoder 或 PngBitmapEncoder 的信息。 (如果这些是照片或扫描我们的JPEG,否则使用PNG。)

【讨论】:

以上是关于使用带有内存流的 c# 在控制台应用程序中保存图像时,GDI + 中发生一般错误的主要内容,如果未能解决你的问题,请参考以下文章

使用流的高内存使用解决方案

从共享内存中保存 4 字节 pP 深度图像

带有流的文件 I/O - 最佳内存缓冲区大小

使用 C# 的图像加载内存泄漏

如何在 C# 中的 WPF 应用程序中保存图像

C#图片框图片消失