将png图像转换为jpg图像时,如何设置png的透明背景色转换为jpg的白色背景色 

解决方案 »

  1.   

    请参考我的BLOG文章,可以设置PNG图片背景:GDI+在Delphi程序的应用 – 真彩色图像转换为索引图像
      

  2.   

    提供2段代码供参考:procedure SaveJpg(Jpg: TGpBitmap; Filename: WideString; Quality: Integer);
    var
      Clsid: TGUID;
      Parameters: TEncoderParameters;
    begin
      // 设置编码品质参数
      Parameters.Count := 1;
      Parameters.Parameter[0].Guid := EncoderQuality;
      Parameters.Parameter[0].ValueType := EncoderParameterValueTypeLong;
      Parameters.Parameter[0].NumberOfValues := 1;
      Parameters.Parameter[0].Value := @Quality;
      GetEncoderClsid('image/jpeg', Clsid);
      Jpg.Save(Filename, Clsid, @Parameters);
    end;// GDI+画图像功能转换
    procedure TForm1.Button1Click(Sender: TObject);
    var
      Png: TGpBitmap;
      Jpg: TGpBitmap;
      g: TGpGraphics;
    begin
      Png := TGpBitmap.Create('d:\xmas_011.png');
      Jpg := TGpBitmap.Create(Png.Width, Png.Height, pf24bppRGB);
      g := TGpGraphics.Create(Jpg);
      g.Clear($FFFFFFFF);  // 白色背景
      g.DrawImage(Png, 0, 0, Png.Width, png.Height);
      g.Free;
      SaveJpg(Jpg, 'd:\1.jpg', 95); // 保存图片,质量为95
      Jpg.Free;
      Png.Free;
    end;// 扫描线计算转换
    procedure TForm1.Button2Click(Sender: TObject);
    var
      Png: TGpBitmap;
      Jpg: TGpBitmap;
      pData, jData: TBitmapData;
      I, Count, Alpha: Integer;
      ps, pd: PRGBQuad;
    begin
      Png := TGpBitmap.Create('d:\xmas_011.png');
      Jpg := TGpBitmap.Create(Png.Width, Png.Height, pf32bppRGB);
      pData := Png.LockBits(GpRect(0, 0, Png.Width, Png.Height),
        [imRead], pf32bppARGB);
      jData := Jpg.LockBits(GpRect(0, 0, Jpg.Width, Jpg.Height),
        [imWrite], pf32bppARGB);
      Count := jData.Width * jData.Height;
      ps := pData.Scan0;
      pd := jData.Scan0;
      for I := 1 to Count do
      begin
        Alpha := ps^.rgbReserved;
        // 前后2个255为RGB分量,255白色
        pd^.rgbBlue := (Alpha * (ps^.rgbBlue - 255)) div 255 + 255;
        pd^.rgbGreen := (Alpha * (ps^.rgbGreen - 255)) div 255 + 255;
        pd^.rgbRed := (Alpha * (ps^.rgbRed - 255)) div 255 + 255;
        Inc(ps);
        Inc(pd)
      end;
      Jpg.UnlockBits(jData);
      Png.UnlockBits(pData);
      SaveJpg(Jpg, 'd:\2.jpg', 95);  // 保存图片,质量为95
      Jpg.Free;
      Png.Free;
    end;