Gif:
http://expert.csdn.net/Expert/topic/679/679628.xml?temp=.3175775
Jpeg的文件格式太复杂了:
http://www.csdn.net/Develop/Read_Article.asp?Id=436

解决方案 »

  1.   

    zyl910(910:分儿,我来了!) 不好意思,里面的原代码我调试不成功 :(
      

  2.   

    see this article    JPEG压缩格式是目前图像处理领域里面用得最广泛的一种图像压缩方式,它的
    实现主要分成四个步骤:
        1.颜色模式转换及采样;
        2.DCT变换(离散余弦变换);
        3.量化;
        4.编码(有算术编码和霍夫曼编码两种,这里采用霍夫曼编码),用VB语言
    编程实现以上四个步骤,即完成了JPEG压缩过程,这里假设给定的源图像是一幅
    24位真彩色的BMP图像。    一、颜色转换及采样    1.颜色转换:对BMP图像中的颜色数据进行由RGB一YCbCr的转换,Y表示亮度,
    CbCr分别表示蓝色度和红色度。 
        转换公式:
        Y=0.2990R+0.5870G+0.1140B
        Cb=-0.1687R-0.3313G+0.5000B
        Cr=0.5000R-0.4187G-0.0813B
        这样转换以后就得到三个新的基色值,对这三个基色值来讲,都可以当作一
    个独立的图像平面来进行压缩编码。
        2.采样:颜色转换后,保留每一点的亮度值Y而色度值Cb,Cr则是每两点保
    留一点,在图像的行和列方向上都可执行颜色采样,这里采用的采样比是行列方
    向都是2:1:1,在行方向,每两点保留一点,列方向也是每两点保留一点,这样如
    果假设原来的CbCr矩阵大小为M*S,则经过2:1:1抽样之后成了M/2*s/2=1/4M*S,
    只有原来的1/4了,图像大大缩小,如果想减小图像的失真度,则可行方向不抽样
    或列方向不抽样。
        程序实现:
        1.读取BMP图像信息,获取图像行像素和列像素数值,在BMP图像中,图像数
    据是以倒序存放的。亦即实际图像第一行数据存放在BMP图像数据矩阵的最后一行,
    依次类推,所以取数据的时候要从BMP图像数据矩阵的最后一行开始读起,把数据
    存放在新建数组(或称矩阵)的第一行,一直取完。BMP图像行像素和列像素的数值
    分别存于文件头信息的第18和22字节。用Get语句可得到Pwidth(图像宽度)和Phight
    (图像高度)的数值。
        2.得到Pwidth*Phight后便得知BMP图像的像素点大小,而数据矩阵(三基色,
    RGB矩阵)的大小是Pwidth*Phight*3,因为每一个像素点都含有RGB三个数据,我
    们要处理的是数据矩阵而不是像素点矩阵。所以,新建数组的大小是(Pwidth*3)*
    Phight。
        在BMP图像数据矩阵中,三原色RGB的排列顺序是这样的:
                 B. G. R. B. G. R...........R
                 B. G. R....................R
                 B........
                 .                          .
                 .                          .
                 .                          .
                 .                          .
                 .                          .
                 .                          .
                 B. G. R....................R    接下来,把这一个矩阵(包含BGR)拆分成三个独立的B、G、R矩阵,得到三个
    新的矩阵(只包含B的矩阵,只包含G的矩阵,只包含R的矩阵),简称为B矩阵、G
    矩阵、R矩阵(大小为Pwidth*Phight),用程序实现拆分,只要依次取原矩阵的第
    1、4、7、10、13......个数据即得到B矩阵,依次读取第2、5、8、11......个数
    据即得到G矩阵,依次读第3、6、9、12......个数据即得到R矩阵。
        得到B、G、R矩阵后再利用颜色转换公式很容易就可得到YCbCr矩阵。
        Y(n)=0.114B(n)+0.587G(n)+0.299R(n)
        Cb(n)=0.5B(n)-0.3313G(n)-0.1687R(n)
        Cr(n)=0.0813B(n)-0.14187G(n)+0.5R(n)
        (For n=1 To PW*PH)
        其中PW为Pwidth的简写,PH为Phight的简写。
        得Y、Cb、Cr矩阵后,先判断一下三个矩阵的行数和列数是否都被16整除,
    如果不能则以最后一行或一列的数据填充到能被16整除为止,所需填充的数目
    为:
        行方向:16-(Pwidth mod 16)
        列方向:16-(Phight mod 16)
        填充以后YCbCr矩阵的大小成为M*S,其中,设M=Pwidth+16-(Pwidth mod 
    16);S=Phight+16-(Phight mod 16)。
        3、抽样:Y矩阵不动,CbCr矩阵行列方向上相邻两点只保留一点的数据值
    (只要在其行方向取第1、3、5、7......个数值,列方向也取1、3、5、7......
    个数据即可完成2:1:1采样),行、列方向都进行2:1:1抽样后的Cb、Cr矩阵大小
    变成原来的1/4(M/2*S/2)。
        现在的结果是Y矩阵大小为M*S,Cb,Cr为M/2*S/2,至此已经完成了颜色转
    换及采样,接下来做第二步——DCT变换。    二、DCT变换    在DCT变换之前得做一些准备工作,由于DCT变换一次只能做64个数据。因
    此,首先得把Y、Cb、Cr矩阵分成一个8*8的小块;其次,由于离散余弦变换公
    式所能接受的数值范围是-128至127之间,因此还得把Y、Cb、Cr矩阵中的每个
    数据减去128。
        分块是一项比较烦琐的工作,尤其是对于Y矩阵,Cb、Cr矩阵好办,直接
    按顺序分成8*8块就可以了,而Y块为了保证4个8*8Y块对应一个8*8Cb块和一个
    8*8Cr块,不致打乱顺序,得先把Y矩阵分成一个个16*16的块,这样得到一个
    16*16Y块对应一个8*8Cb块和一个8*8Cr块,然后再把每一个16*16块分成四个
    8*8小块,图示如下:      Y metrix
          8  16      M  8   1 2 5 6 ...
     16   3 4 7 8
      
      S      Cb
          8         M/2
      8   1 2 3 ..  M/2      Cr
          8         M/2
      8   1 2 3 ..  M/2
      

  3.   

    there a many article, u can search it youself
      

  4.   

    那试试这个:
    http://www.csdn.net/expert/topic/571/571562.xml?temp=.9796717
      

  5.   

    The XML page cannot be displayed 
    Cannot view XML input using style sheet. Please correct the error and then click the Refresh button, or try again later. 拒绝访问。 Error processing resource 'http://www.csdn.net/expert/topic/571/571562.xml?temp=.9796717'. 
     
    :(
      

  6.   

    那是CSDN的问题
    现在能打开!
      

  7.   

    http://expert.csdn.net/Expert/topic/571/571562.xml?temp=.9796717OK 把地址修改一下就能进入了