想用无损压缩一个bmp图象,急求函数或算法


我现在用C++/C语言写了一个Bmp图象的程序
现在想把这个程序进行无损压缩,就是把压缩的部分写在
我的这个程序里面
请大家帮帮忙
怎么写这个无损压缩的函数啊

27 个解决方案

#1


我只知道哈夫曼编码可以进行无损压缩。
o(∩_∩)o...

#2


JPEG-2000可以搞无损压缩,不过难度比较大
简单的方法可以直接用算术编码进行压缩,不过没有进行小波变换和量化过程,效果肯定不明显

#3


用gzip 7z等开源的压缩算法,有函数库的。

#4


学习

#5


只要Bmp的,
#include "stdio.h" 
#include "stdlib.h" 
#include "string.h" 

typedef unsigned char BYTE; 
typedef unsigned long DWORD; 
typedef unsigned short WORD; 
#include <pshpack2.h> 
typedef struct { 
        WORD    bfType; 
        DWORD  bfSize; 
        WORD    bfReserved1; 
        WORD    bfReserved2; 
        DWORD  bfOffBits; 
} BMPFILEHEADER_T; 

struct BMPFILEHEADER_S{ 
        WORD    bfType; 
        DWORD  bfSize; 
        WORD    bfReserved1; 
        WORD    bfReserved2; 
        DWORD  bfOffBits; 
}; 

typedef struct{ 
        DWORD      biSize; 
        DWORD      biWidth; 
        DWORD      biHeight; 
        WORD      biPlanes; 
        WORD      biBitCount; 
        DWORD      biCompression; 
        DWORD      biSizeImage; 
        DWORD      biXPelsPerMeter; 
        DWORD      biYPelsPerMeter; 
        DWORD      biClrUsed; 
        DWORD      biClrImportant; 
} BMPINFOHEADER_T; 
unsigned char array[8]={0,0,0,0,0xff,0xff,0xff,0}; 
void Snapshot( BYTE * pData, char * filename ) 

  int width=320; 
  int height=240; 
      int size = width*height/8; 
      BMPFILEHEADER_T bfh; 
      bfh.bfType = 0x4d42;  
      bfh.bfSize = size + sizeof( BMPFILEHEADER_T ) + sizeof( BMPINFOHEADER_T )+8; 
      bfh.bfReserved1 = 0;  
      bfh.bfReserved2 = 0; 
      bfh.bfOffBits = bfh.bfSize - size; 
      
      BMPINFOHEADER_T bih; 
      bih.biSize = sizeof(BMPINFOHEADER_T); 
      bih.biWidth = width; 
      bih.biHeight = height; 
      bih.biPlanes = 1; 
      bih.biBitCount =1; 
      bih.biCompression = 0;    /*******************/ 
      bih.biSizeImage = size; 
      bih.biXPelsPerMeter = 0; 
      bih.biYPelsPerMeter = 0; 
      bih.biClrUsed = 0; 
      bih.biClrImportant = 0;  

      FILE * fp = fopen( filename,"wb"); 
      if( !fp ) return; 

      fwrite( &bfh, 1, sizeof(BMPFILEHEADER_T), fp); 
      fwrite( &bih, 1, sizeof(BMPINFOHEADER_T), fp); 
  fwrite( array, 1, 8,fp); 
      fwrite( pData, 1, size, fp ); 
      fclose( fp ); 
  

void main() 
{  

    unsigned char pRGB[320*240/8]; 
FILE * fpf = fopen("keyima.bin","rb"); 
    if (!fpf) return; 
    fread(pRGB,1,9600,fpf); 
Snapshot((BYTE* )pRGB,"C:\\test.bmp" ); 



上面的程序 
哪位大哥能帮我写个rle无损压缩的函数,把上面的位图压缩小点 
急求谢谢了,分不够的话可以追加,急要这个压缩函数,帮帮忙啊大哥大姐们! 

#6


我可以给你提供一个思路
最简单的办法,用行程编码进行编码,然后再用自己设计的解码器来看这张图片(也就是说,经你压缩的图片用别的浏览器是看不出来的)。
首先吧BMP的文件头解析出来,可以参看BMP的文件协议,从你的代码来看,你对BMP的文件结构已经很了解了。
其实BMP的文件协议很简单的。
然后定义自己的文件头,包含类似于以下的信息:版本号,文件尺度,压缩标记等等。
我感觉,最重要的就是协议的制定,协议作好以后,代码都是小问题。

#7




google  关键字  LZARI压缩类

#8


我上面的那个程序只能输出个bmp图片,自己设计个解码器是在重新定义一个bmp文件结构吗,把压缩后的文件再重新输出来?
bmp的头文件需要压缩吗?

#9


各位高手帮忙啊!
bmp的文件头我上面有过定义啊,压缩后还得怎么定义啊?
再有一个问题就是无损压缩代码怎么实现啊?

#10


6楼的那位大哥你帮帮我好吗?我被这件事情捆饶了很久,没人帮我了
你帮我解决一下好吗?

#11


无损图像还是有不少的,不过你这么急,直接用zip好了,有源码。这种方法最简单,只不过压缩后不是图像了,其他看图软件打不开。

#12


不知道你说的头文件压缩是什么意思
我的意思是说,如果你想作自己的图像协议的话,头文件你完全可以自己定义,头文件没有压缩的必要,头文件只记录一些参数性质的信息,没有多大的,最多1K吧,没有必要压缩的。
图像部分,你可以先分析BMP的文件中每个像素的信息是如何组织的,然后用自己定义的压缩算法来对这些像素进行编码,存入自己的图像文件中。
关于压缩算法,最简单的就是形成编码,就是把连续相同的像素表示成 :
像素值 重复次数的形式进行存储。

#13


没太明白lz的意思
如果你是想压缩整张图片,直接对bmp压缩就好了,算法可以用zip
如果你是只想压缩图片的数据,那就把数据分出来压缩,bmp头单独保存

#14


密切关注

#15


如果头文件不压缩的话,光是把数据压缩了,那么压缩后的数据放在压缩前的头上,也显示不出来图片啊!
我的意思很简单就是自己写一个bmp图象(别的颜色不要,就是黑白的),然后把这个图象无损压缩了;压缩和写
图象的代码自己写,就这是样一个程序!上面发的程序只是把图象显示出来了,没有压缩,无损压缩我不会了,
现在就是想,谁能帮我把这个无损压缩给写出来!求求大家了!急想知道是个怎么样的一个过程!希望大家帮我实现一下

#16


http://www.libpng.org/
png 格式是无损的

#17


朋友们帮帮忙,压缩的头文件该怎么定义
看看上面的程序和要求
帮忙解决一下吧
又捆饶一个星期了

#18


fff

#19


up

#20


http://topic.csdn.net/u/20080829/12/d8ec6109-5a67-402a-827c-99c67a38e2a5.html

里面的回帖里看俺贴的代码!(rle)


http://download.csdn.net/source/400904 (lzw)

#21


现在我想知道
压缩后的bmp的头文件该怎么去定义啊
越来越不清晰了我

#22


自个儿顶了

#24


这个绝对是无损压缩,而且可以对任意文件压缩

#25


自己顶

#26


BI_RLE4的编码方式:由2个字节组成,第一个字节指定像素数目,第二个字节包含两种颜色索引,一个在高4位,另一个在低4位。第一个像素使用高4位的颜色索引,第二个使用低4位的颜色索引,第3个使用高4位的颜色索引,依此类推。

就用这个算法,谁能帮我举出个列子.

#27


BI_RLE4算法:
比如:00 00 00 00 00 06 07 08 09 00 04 45 34 23 45 08 09 09 00 05 05 05 05 05 00 01
这样的一串数据,用BI_RLE4的编码方式算法压缩
压缩后的结果是什么:?
智能推荐

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告