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
原创粉丝点击