我想把按jpeg格式有损或无损压缩的数据,还原为bmp格式,看了网上一些介绍jpeg格式的文章和压缩解压缩的文章,格式差不多了,可压缩解压缩的过程还是搞不清楚,哪位可以详细介绍一下呢?谢谢!

解决方案 »

  1.   

    jpg 2 bmp 通常为有损压缩,即使还原也不可能完全恢复原来的品质不信你拿AcdSee试试
      

  2.   

    procedure SaveJpegToSys(aPicFileName:TFileName;aInSysFileName:TFileName);
    //把.jpeg文件转化成.bmp文件后保存在系统的windows目录下mywallpaper.bmp
    var
      pic_jpeg:TJpegImage;
      pic_bmp:TBitMap;
    begin
      pic_jpeg:=TJpegImage.Create;
      try
        pic_bmp:=TBitMap.Create;
        try
          pic_jpeg.LoadFromFile(aPicFileName);
          pic_bmp.Assign(pic_jpeg);
          pic_bmp.SaveToFile(aInSysFileName);
        finally
          pic_bmp.Free;
        end;
      finally
        pic_jpeg.Free;
      end;
    end;
      

  3.   

    procedure JPG2BMP(const Source, Target:string);
    var
        JPG: TJpegImage;
        BMP: TBitmap;
    begin
      BMP := TBitmap.Create;
      JPG := TJpegImage.Create;
      try
        JPG.LoadFromFile(Source);
        BMP.Assign(JPG);
        BMP.SaveToFile(Target);
      finally
        BMP.free;
        JPG.Free;
      end;
    end;
    procedure  ZoomBmp(Source:   String;   dWidth,   dHeight:   Integer;   var   des:   TBitmap);
    var
          ori,imagen:   TBitmap;
          dispositivo_o,   dispositivo_d:   HDC;   
          pepito:   HBitmap;   
    begin
      try
          ori   :=   Tbitmap.Create;   
          des   :=   TBItmap.Create;
          imagen :=  TBitmap.Create;
          imagen.LoadFromFile(Source);
          ori.handle   :=   imagen.handle;   
          des.width   :=   dWidth;   
          des.height   :=   dHeight;   
          dispositivo_o   :=   CreateCompatibleDC(0);   
          dispositivo_d   :=   CreateCompatibleDC(0);   
          SelectObject(dispositivo_o,   ori.handle);   
          pepito   :=   SelectObject(dispositivo_d,   des.handle);   
          SetStretchBltMode(dispositivo_d,     STRETCH_HALFTONE);   
          StretchBlt(dispositivo_d,   0,   0,   dWidth,   dHeight,   dispositivo_o,   0,   0,   ori.width,   ori.height,   SRCCOPY);   
          SelectObject(dispositivo_d,   pepito);
      finally
          ori.Free;
          DeleteObject(pepito);
          DeleteDC(dispositivo_o);
          DeleteDC(dispositivo_d);
      end;
    end;采用以上方法,效果还可以,失真肯定会有的,只是多少的问题.
      

  4.   

    我的意思是自己分析jpeg的格式,而不是用这种办法。我现在可以得到jpeg中霍夫曼表DHT的数据,该怎么解码呢?
      

  5.   

    喔,我觉得还是用TBitmap控件来转一下最为方便,虽然速度上可能会慢一些。
      

  6.   

    jpeg的文件格式我研究得差不多了,现在主要的问题是:已知huffman表的数据,如何对jpeg数据解码?
      

  7.   

    佩服佩服是不是还要了解一下bmp格式?以及bmp2jpg的算法?
    bmp这种位图格式到jpg究竟压缩掉了那些东东,该怎么还原
    我只知道一种方法的皮毛,就是把颜色相同的区域(比如颜色代码是01001,应该是一个矩阵)转换为只存储颜色代码和区域(或位置)的代码,bmp To jpg 的压缩程度一定程度上也就是颜色(色深)相似度的范围
      

  8.   

    对了,楼主是不是可以看一下jpeg.pas???我也没有细看过,所以仅供参考
      

  9.   

    呵呵,如果不想了解过程我就不用发这个帖子了我现在从jpeg文件中得到哈夫曼表,生成哈夫曼树,然后该怎么解码呢?
      

  10.   

    bang ding ,,,处理图片需要这么麻烦吗?
      

  11.   

    如果楼主学过VC++的话自己去找一下相关的代码即可
    解码方式有很多种,这恐怕一时说不清楚,就算是vc都至少有2种
      

  12.   


    完全错了jpeg.pas里只是对libjpeg的封装和转换成TBitmap位图的相关代码LZ可下份libjpeg,细节都有数字解码完成后主要步骤如下:反量化,重排列数据为8x8矩阵,IDCT,转YcrCb到RGB...