c#多图image压缩并保存为同一个二进制文件
来源:互联网 发布:我的知鸟怎么没有首页 编辑:程序博客网 时间:2024/05/19 14:54
1.多张大图先压缩,再保存为同一个同一个二进制文件。
2.从二进制文件读出所有图片的数据恢复为图片Image。
原始图片:大小为1920*1080, 665K
先压缩保存为二进制文件,循环保存302次:
文件大小为44M
string fileZipStream = @"C:\Documents and Settings\Administrator\桌面\media icon\jpegstream.dat";string fileXmlPath = @"C:\Documents and Settings\Administrator\My Documents\My Pictures\bytetest.xml";string ImageFile = @"C:\Documents and Settings\Administrator\桌面\media icon\原图.jpg";/// <summary>/// 压缩保存为XML/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnWrite_Click(object sender, RoutedEventArgs e){ImageListCompress2BinaryFileTest();}public void ImageListCompress2BinaryFileTest(){string fileZipNew1 = @"C:\Documents and Settings\Administrator\桌面\media icon\001.jpg";string fileZipNew2 = @"C:\Documents and Settings\Administrator\桌面\media icon\002.jpg";string fileZipNew3 = @"C:\Documents and Settings\Administrator\桌面\media icon\003.jpg";//Bitmap myBitmap;System.Drawing.Image imgPng = new System.Drawing.Bitmap(ImageFile);ImageCodecInfo myImageCodecInfo;System.Drawing.Imaging.Encoder myEncoder;EncoderParameter myEncoderParameter;EncoderParameters myEncoderParameters;// Create a Bitmap object based on a BMP file.//myBitmap = new Bitmap(fileOld);// Get an ImageCodecInfo object that represents the JPEG codec.myImageCodecInfo = GetEncoderInfo("image/jpeg");// Create an Encoder object based on the GUID// for the Quality parameter category.myEncoder = System.Drawing.Imaging.Encoder.Quality;// Create an EncoderParameters object.// An EncoderParameters object has an array of EncoderParameter// objects. In this case, there is only one// EncoderParameter object in the array.myEncoderParameters = new EncoderParameters(1);// Save the bitmap as a JPEG file with quality level 25.myEncoderParameter = new EncoderParameter(myEncoder, 25L);myEncoderParameters.Param[0] = myEncoderParameter;imgPng.Save(fileZipNew1, myImageCodecInfo, myEncoderParameters);// Save the bitmap as a JPEG file with quality level 50.myEncoderParameter = new EncoderParameter(myEncoder, 50L);myEncoderParameters.Param[0] = myEncoderParameter;imgPng.Save(fileZipNew2, myImageCodecInfo, myEncoderParameters);// Save the bitmap as a JPEG file with quality level 75.myEncoderParameter = new EncoderParameter(myEncoder, 75L);myEncoderParameters.Param[0] = myEncoderParameter;imgPng.Save(fileZipNew3, myImageCodecInfo, myEncoderParameters);System.Drawing.Image imgPng1 = new System.Drawing.Bitmap(fileZipNew1);byte[] byteImg1 = Image2Byte(imgPng1);System.Drawing.Image imgPng2 = new System.Drawing.Bitmap(fileZipNew2);byte[] byteImg2 = Image2Byte(imgPng2);System.Drawing.Image imgPng3 = new System.Drawing.Bitmap(fileZipNew3);byte[] byteImg3 = Image2Byte(imgPng3);FileStream fs = new FileStream(fileZipStream, FileMode.Create);BinaryWriter w = new BinaryWriter(fs);w.Write(byteImg1.Length);w.Write(byteImg1);w.Write(byteImg2.Length);w.Write(byteImg2);w.Write(byteImg3.Length);w.Write(byteImg3);for (int i = 0; i < 300; i++){w.Write(byteImg2.Length);w.Write(byteImg2);}w.Close();}
然后再从二进制文件中读取图片数据
private void btnRead_Click(object sender, RoutedEventArgs e){LoadStreamImageData();return;}public void LoadStreamImageData(){FileStream fs = new FileStream(fileZipStream, FileMode.Open);// 使用文件流构造一个二进制读取器将基元数据读作二进制值BinaryReader br = new BinaryReader(fs);while (true){try{int n = br.ReadInt32();byte[] imgByte = br.ReadBytes(n);//System.Drawing.Image img = Byte2Image(imgByte);BitmapImage imgSource = ByteArrayToBitmapImage(imgByte);image2.Source = imgSource;//System.Threading.Thread.Sleep(1000);}catch (System.Exception e){MessageBox.Show(e.Message);break;}}fs.Close();}private static ImageCodecInfo GetEncoderInfo(String mimeType){int j;ImageCodecInfo[] encoders;encoders = ImageCodecInfo.GetImageEncoders();for (j = 0; j < encoders.Length; ++j){if (encoders[j].MimeType == mimeType)return encoders[j];}return null;}///图片转二进制private byte[] convertByte(System.Drawing.Image img){MemoryStream ms = new MemoryStream();img.Save(ms, img.RawFormat);//byte[] bytes = new byte[ms.Length];//ms.Read(bytes, 0, Convert.ToInt32(ms.Length));//以上两句改成下面两句byte[] bytes = ms.ToArray();ms.Close();return bytes;}public byte[] Image2Byte(System.Drawing.Image img){MemoryStream msStream = new MemoryStream();img.Save(msStream, System.Drawing.Imaging.ImageFormat.Jpeg);byte[] byData = new byte[msStream.Length];msStream.Position = 0;msStream.Read(byData, 0, byData.Length);msStream.Close();return byData;}public System.Drawing.Image Byte2Image(byte[] streamByte){System.IO.MemoryStream ms = new System.IO.MemoryStream(streamByte);System.Drawing.Image img = System.Drawing.Image.FromStream(ms);return img;}
XMAL代码:
<Window x:Class="WpfAppByteZipTest.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="346" Width="531"> <Grid > <Button Content="压缩保存" Height="23" HorizontalAlignment="Left" Margin="54,272,0,0" Name="button1" VerticalAlignment="Top" Width="151" Click="btnWrite_Click" /> <Button Content="解压图像数据" Height="23" HorizontalAlignment="Left" Margin="270,272,0,0" Name="button2" VerticalAlignment="Top" Width="162" Click="btnRead_Click" /> <Image Height="239" HorizontalAlignment="Left" Margin="270,12,0,0" Name="image2" Stretch="Fill" VerticalAlignment="Top" Width="227" /> <Image Height="239" HorizontalAlignment="Left" Margin="12,12,0,0" Name="image1" Stretch="Fill" VerticalAlignment="Top" Width="243" /> </Grid></Window>
0 0
- c#多图image压缩并保存为同一个二进制文件
- 二进制文件的读取并保存为文本文件
- 文本文件保存为二进制文件
- Mat 数据类型保存为二进制文件
- Mat 数据类型保存为二进制文件
- c语言实现把‘0’和‘1’字符串转化为二进制压缩保存成二进制文件
- 保存全屏为image
- 保存全屏为image
- 用python提取caffemodel网络参数并保存为二进制文件.bat
- C# 绘制曲线图,并保存为Gif格式文件 调试通过
- C# 读取Excel文件 并保存为html文件
- 使用C#写入并保存为*.txt和读取数据
- c# 页面打印预览 并保存为PDF
- 网络图片下载并压缩保存
- 二进制文件转成文本保存,并可以读回
- C++读取二进制文件到二维数组并保存到文本文件
- 将Image对象保存为png文件
- 将一个Componet保存为Image
- ubuntu 下面libxml2的安装与使用--注意 -lxml2 不放置在最后编译会报错!
- C#访问文件路径通用类
- Linux中的EAGAIN、Resource temporarily unavailable含义
- TP-Link WR842N VPN错误619 不能建立到远程计算机的连接
- c++笔记
- c#多图image压缩并保存为同一个二进制文件
- 在字符串中删除特定的字符
- Android学习小Demo(23)Aidl实现进程间通信
- C#加密帮助类EncryptHelper
- 远程桌面连接Windows Azure中的Ubuntu虚拟机
- 各种GNU、Linux网址
- Python正则表达式指南
- 树莓派学习之初
- 关于该博客的用途