现在要搞一个转换的功能,就是把 BMP,JPG,GIF,PNG,TIF 这些格式图片,压缩转换成JPG的图片,网上有一些例子,不过这些转换都会有很大的色差...
采用TJpegImage 这个类进行转换时,都会有一定的色差, 而且色差比较大,不支持GIF 的格式....
如果用 TGpBitmap 这个类来进行转换的话,无法更改图片的像素,而且色差比上面的更大,有没有别的方法可以实现少损压缩转换的?

解决方案 »

  1.   

    可参见我的文章:GDI+ 在Delphi程序的应用 -- GDI+图像与GDI位图的相互转换
      

  2.   

    楼上的兄弟....
    谢谢你,我正是用了你的那个函数进行转换,才会出现上面的情况...
    procedure TForm1.ImageConverToJpg(FileName : string);    //色差大,品质较差  ,支持所有格式 无法更改像素
    var
      Bmp: TGpBitmap;
      Clsid: TGUID;
      Parameters: TEncoderParameters;
      Quality: Integer;
      ExtName : string;
      Image :TImage;
    begin
      //处理保存的名称
      Image := TImage.Create(self);
      ExtName := copy(FileName,1,length(FileName) - 3);
      ExtName := ExtName + '.jpg';
      with Image.Picture.Bitmap do
      bmp := TGpBitmap.Create(FileName);
      if GetEncoderClsid('image/jpeg', Clsid) then
      begin
        Parameters.Count := 1;
        Parameters.Parameter[0].Guid := EncoderQuality;
        Parameters.Parameter[0].ValueType := EncoderParameterValueTypeLong;
        Parameters.Parameter[0].NumberOfValues := 1;
        Quality := 90;                                 // 图片质量90
        Parameters.Parameter[0].Value := @Quality;
        bmp.Save(ExtName, Clsid, @Parameters);
      end;
      bmp.Free;
    end;
      

  3.   

    搞过一段时间,delphi控件有局限性,要不用第三方,要不直接用windows api
    如果做商业应用,用第三方吧
      

  4.   

    最简单是找三方控件。主要是多种格式的支持,这个和语言没有关系。
    转换是非常简单的问题,将要转换的图片Draw到Bitmap对象中,然后再转换成jpg就可以,注意的是bitmap最好是24位或者32位的
      

  5.   

    to LZ:你所说的无法更改像素是指图像分辨率吗?如是,则GDI+的TGpBitmap的procedure SetResolution(xdpi, ydpi: Single)方法可以修改。至于你说的色差大,品质较差的问题:不同图像格式之间的转换过程中,颜色损失是难免的,损失的程度这取决于原图的质量的新图压缩率。比如你要把一张256色的图片转换为24位图像格式,无论什么方法,总会失真。如果原图质量好,转换为JPEG格式时可多压缩一些,反之,应少压缩一些。从前面你的代码看,既然知道品质较差,为什么不将Quality := 100?我用GDI+转换过不少图片(原图质量上中等),一般都还行,不知道你的为什么不行?估计你的原图质量不太好。 
      

  6.   

    -------------------
    我试过了用你说的那个方法修改像素,可改后的图片像素没变...将Quality设为100似乎效果也差不多...
      

  7.   

    本来想加你QQ,但又觉得不妥。所以我事先说明:我的方法是不用写任何代码的,是一个控件,只要你安装后,就可以实现你所说的这几种图片格式相互转换,就是转成AVI都没有问题。从处理问题角度来说,我的方法可以满足你,但如果你不需要这种方法,那我看我还是不加你为妙。以节省大家时间。