我正在为我的项目中的压缩.bmp图像做一个WPF表单应用程序。 我想使用RLE压缩算法和Huffman压缩图像。 我通过引用MSDN尝试下面的代码,但原始图像和压缩图像具有相同的大小。
private List<double> HuffmanAndRle(int size)
{
try
{
if((size > _image.Width) || (size > _image.Height))
throw new Exception("size is too large");
Bitmap bitmaporg = crop(size);
Bitmap bitmapRLE = crop(size);
Bitmap bitmapHuffman = crop(size);
ImageCodecInfo myImageCodecInfo ;
myImageCodecInfo = GetEncoderInfo("image/bmp");
var myEncoderParameters = new EncoderParameters(1);
var enc = new Encoder(Encoder.Compression.Guid);
myEncoderParameters.Param[0] = new EncoderParameter(enc, (long)EncoderValue.CompressionCCITT4);
bitmapHuffman.Save("C:/Hffman.bmp", myImageCodecInfo, myEncoderParameters);
//bitmapHuffman.Save()
var myEncoderParameters1 = new EncoderParameters(1);
myEncoderParameters1.Param[0] = new EncoderParameter(Encoder.Compression, (long)EncoderValue.CompressionNone);
bitmaporg.Save("C:/org.bmp", myImageCodecInfo, myEncoderParameters1);
var myEncoderParameters2 = new EncoderParameters(1);
myEncoderParameters2.Param[0] = new EncoderParameter(Encoder.Compression, (long)EncoderValue.CompressionRle);
bitmapRLE.Save("C:/RLE.bmp", myImageCodecInfo, myEncoderParameters2);
var org =new BitmapImage(new Uri("C:/org.bmp"));
var rle = new BitmapImage(new Uri("C:/RLE.bmp"));
var huffman = new BitmapImage(new Uri("C:/Hffman.bmp"));
var dobles = new List<double>();
dobles.Add(ImageSize2(huffman)/ImageSize2(org));
dobles.Add(ImageSize2(rle)/ImageSize2(org));
return dobles;
}
catch (Exception e)
{
MessageBox.Show("Error : " + e.Message);
return null;
}
}
那么问题在哪里?
答案 0 :(得分:0)
霍夫曼算法不适合所有文件的压缩,如果我们有少量字符,我们的压缩结果会更好,但如果我们有更多,那么压缩将更少或在某些情况下比原始文件大小更多。我们在文本文件上使用Huffman算法时的最佳压缩。