首页 行业资讯 宠物日常 宠物养护 宠物健康 宠物故事

请问微软.net自带压缩功能是在什么地方啊

发布网友

我来回答

2个回答

热心网友

现在在 ASP.NET 中本身有两个类:DeflateStream 和 GZipStream 来于处理压缩和解压缩,这两个类分别使用的是 DEFLATE 和 gzip 压缩算法,这两个算法被一些压缩软件支持,比如 WinRAR 就支持 gzip。这两个类的名称空间均为:

System.IO.Compression

这两个类在应用上完全一致,只讲其中一个类的用法,要使用另一个类,只需要把源代码中的类名称替换就可以了。

工作原理:
压缩步骤:往压缩流中写入未压缩的数据->关闭压缩流->从内存流中读取压缩了的数据
解压步骤:往内存流中写入压缩了的数据->从压缩流中读取解压了的数据。

可以看到压缩流(DeflateStream 或 GZipStream)与未压缩或解压了的数据打交道,而内存流(MemoryStream)与压缩了的数据打交道。

压缩代码:

//文件流
FileStream reader;
reader = File.Open("D:\\foo.txt", FileMode.Open);
FileStream writer;
writer = File.Create("D:\\dest.gzip");

//压缩相关的流
MemoryStream ms = new MemoryStream();
GZipStream zipStream = new GZipStream(ms, CompressionMode.Compress, true);

//往压缩流中写数据
byte[] sourceBuffer = new byte[reader.Length];
reader.Read(sourceBuffer, 0, sourceBuffer.Length);
zipStream.Write(sourceBuffer, 0, sourceBuffer.Length);

//一定要在内存流读取之前关闭压缩流
zipStream.Close();
zipStream.Dispose();

//从内存流中读数据
ms.Position = 0; //注意,不要遗漏此句
byte[] destBuffer = new byte[ms.Length];
ms.Read(destBuffer, 0, destBuffer.Length);
writer.Write(destBuffer, 0, destBuffer.Length);

//关闭并释放内存流
ms.Close();
ms.Dispose();

//关闭并释放文件流
writer.Close();
writer.Dispose();
reader.Close();
reader.Dispose();
两点注意:

一定要在内存流读取之前关闭压缩流。
从内存中读数据时指定位置 0 不可少。
解压代码:

//文件流
FileStream reader;
reader = File.Open("D:\\dest.gzip", FileMode.Open);
FileStream writer;
writer = File.Create("D:\\dest.txt");

//解压相关的流,同时向内存流中写数据
byte[] sourceBuffer = new byte[reader.Length];
reader.Read(sourceBuffer, 0, sourceBuffer.Length);
MemoryStream ms = new MemoryStream(sourceBuffer);
GZipStream zipStream = new GZipStream(ms, CompressionMode.Decompress, true);

byte[] destBuffer = new byte[1];
while (zipStream.Read(destBuffer, 0, destBuffer.Length) > 0)
{
writer.Write(destBuffer, 0, destBuffer.Length);
}

//释放并关闭解压流和内存流
zipStream.Close();
zipStream.Dispose();
ms.Close();
ms.Dispose();

//关闭并释放文件流
writer.Close();
writer.Dispose();
reader.Close();
reader.Dispose();
一点注意

对 GZipStream 使用 Position 和 Length 总是会产生异常。
词汇

DEFLATE 是同时使用了 LZ77 算法与哈夫曼编码的一个无损数据压缩算法。它最初是由 Phil Katz 为他的 PKZIP 归档工具第二版所定义的,后来定义在 RFC1951 规范中。
gzip 的基础是 DEFLATE,DEFLATE 是 LZ77 与哈夫曼编码的一个组合体。DEFLATE 最初是作为 LZW 以及其它受专利保护的数据压缩算法的替代版本而设计的,当时那些专利*了 compress 以及其它一些流行的归档工具的应用。

热心网友

效地方法就是降低图片的分辨率,即像素值。图片的每个像素占用4个字节,假设一般JPG格式的压缩比为1:10的话,40K字节最多只能储存 40000/4*10 = 10万像素的图片,即图片的长乘以宽不超过10万,一般图片长宽比是4:3;所以图片的大小最好不超过 360 X 270 。
降低图片的分辨率就是缩小图片,用Graphics对象、Bitmap对象就能做到。

Bitmap bmpDest = new Bitmap(360,270);
Bitmap bmpSrc = new Bitmap("Source.jpg");
Graphics g = Graphics.FromImge(bmpDest);
g.DrawImage(bmpSrc, rectDest,rectSrc,GraphicsUnit.Pixel);

或者将PictureBox的长和宽限定在360 X 270

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com