C#读取保存图像踩坑之FileStream类

张开发
2026/4/5 1:21:43 15 分钟阅读

分享文章

C#读取保存图像踩坑之FileStream类
前言我们在开发C#上位机程序的过程中经常需要读取本地图像以及将图像数据主要是bitmap图像保存到本地本文就来介绍读取和保存图像数据过程中遇到的奇葩大坑之一FileStream类读取图像。1、读取图像函数如下BitmapGetImg_Error1(stringfileName){Bitmaporig_Bitmapnull;try{using(FileStreamfsnewFileStream(fileName,FileMode.Open)){orig_BitmapnewBitmap(fs);}}catch(Exceptionex){MessageBox.Show($加载图像异常:{ex.Messageex.StackTrace},{fileName});}returnorig_Bitmap;}我们这里读取了三种图像数据jpg、png、bmp分别如下2、读取jpg下面的代码读取1.jpg图像10次并且存入一个List中最后执行保存图像方法。privatevoidbtn_jpg_Click(objectsender,EventArgse){stringfileName1.jpg;bitmapList.Clear();intcount10;for(inti0;icount;i){BitmapbmpGetImg_Error1(fileName);bitmapList.Add(bmp);}for(inti0;ibitmapList.Count;i){stringfileNameNew(i10).bmp;bitmapList[i].Save(fileNameNew);}}保存图像数据过程中会抛出异常上面的代码看起来没啥问题但是为啥报错了原因是JPEG 是压缩格式Bitmap 可能延迟解码保存时需要重新访问流但是这时候FileStream流已经被释放了所以就报错了。3、读取png下面的代码读取1.jpg图像10次并且存入一个List中最后执行保存图像方法下面的代码没有报错。privatevoidbtn_png_Click(objectsender,EventArgse){stringfileName1.png;bitmapList.Clear();intcount10;for(inti0;icount;i){BitmapbmpGetImg_Error1(fileName);bitmapList.Add(bmp);}for(inti0;ibitmapList.Count;i){stringfileNameNew(i10).bmp;bitmapList[i].Save(fileNameNew);}}4、读取bmp下面的代码读取1.bmp图像10次并且存入一个List中最后执行保存图像方法下面的代码没有报错。privatevoidbtn_bmp_Click(objectsender,EventArgse){stringfileName1.bmp;bitmapList.Clear();intcount10;for(inti0;icount;i){BitmapbmpGetImg_Error1(fileName);bitmapList.Add(bmp);}for(inti0;ibitmapList.Count;i){stringfileNameNew(i10).bmp;bitmapList[i].Save(fileNameNew);}}5、解决方法以上读取三种图像居然得到了不同的结果那么能不能读取三种不同图像得到相同结果呢答案是是可以的只需要在图像图像的时候对图像进行复制可以代码如下BitmapGetImg_OK(stringfileName){BitmapcopyBmpnull;try{using(FileStreamfsnewFileStream(fileName,FileMode.Open)){using(Bitmaporig_BitmapnewBitmap(fs)){copyBmpnewBitmap(orig_Bitmap.Width,orig_Bitmap.Height,System.Drawing.Imaging.PixelFormat.Format24bppRgb);using(GraphicsgGraphics.FromImage(copyBmp)){g.DrawImage(orig_Bitmap,0,0,orig_Bitmap.Width,orig_Bitmap.Height);}};}}catch(Exceptionex){MessageBox.Show($加载图像异常:{ex.Messageex.StackTrace},{fileName});}returncopyBmp;}上面的代码中首先依靠FileStream获取了图像orig_Bitmap然后使用Graphics 类去复制一份图像数据即可。马工撰写的年入30万C#上位机项目实战必备教程点击下方链接即可访问文章目录1、《C#串口通信从入门到精通》2、《C#与PLC通信从入门到精通 》3、《C# Modbus通信从入门到精通》4、《C#Socket通信从入门到精通 》5、《C# MES通信从入门到精通》6、《winform控件从入门到精通》7、《C#操作MySql数据库从入门到精通》以上教程CSDN订阅已超过2000~

更多文章