利用GDI+,将png图像转换为jpg图像时,如何设置png的透明背景色转换为jpg的白色背景色    Image   :=   TGPImage.Create('d:\test.png'); 
    GetEncoderClsid('image/jpeg',   encoderClsid);
    TGPBitmap(image).SetResolution(150,50);
    image.Save('test.jpg',   encoderClsid);
    image.Free;
上面只是转换部分的代码,已实现转换,但是转换出现问题:
原来png图片的透明背景色转到jpg图片后,就变成黑色的背景色了问题:如何设置转换的时候能够转换为白色背景色

解决方案 »

  1.   

    不是不是简单的设置那个参数就能搞定的,而是要自己中间读取图像数据后,根据alpha值算出新的结果值的。
      

  2.   

    直接将PNG画到TBITMAP上,然后再将TBITMAP转换为JPG就可以了..背景色是白色的
      

  3.   

    没有用,我试过了,有的png图片可以,有的不行
    我换了一种方法转换:GetEncoderClsid('image/jpeg',   encoderClsid);
    bmp := TGpBitmap.Create(imagepath+'5T9K44.png');
    bmp.Save(imagepath+'5T9K44.jpg',encoderClsid);
    有的透明色是转换为白色了,但是有的就是直接边黑色了
      

  4.   

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

  5.   

    提供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;
      

  6.   


    procedure Conver32To24(var Image: TGPBitmap; Src: TGPBitmap; TranColor: TColor);
    var
      Data1, Data2: TBitmapData;
      W, H, y1, y2: integer;
      x, y, alpha: Integer;
      p1: PRGBType;
      p2: PRGBAType;
      tR, tG, tB: Byte;
    begin
      tR := GetRValue(TranColor);
      tG := GetGValue(TranColor);
      tB := GetBValue(TranColor);
      W := Src.GetWidth;
      H := Src.GetHeight;
      Image := TGPBitmap.Create(W, H, PixelFormat24bppRGB);
      Image.LockBits(MakeRect(0, 0, W, H), ImageLockModeRead or ImageLockModeWrite, PixelFormat24bppRGB, Data1);  Src.LockBits(MakeRect(0, 0, W, H), ImageLockModeRead, PixelFormat32bppARGB, Data2);  for y := 0 to H - 1 do
      begin
        y1 := y * Data1.Stride;
        y2 := y * Data2.Stride;
        for x := 0 to W - 1 do
        begin
          p1 := PRGBType(PChar(Data1.Scan0) + y1 + x * 3);
          p2 := PRGBAType(PChar(Data2.Scan0) + y2 + x * 4);
          alpha := p2^.Alpha * 100 div 255;      p1^.Red := IntToByte((tR * (100 - alpha) + p2^.Red * alpha) div 100);
          p1^.Green := IntToByte((tG * (100 - alpha) + p2^.Green * alpha) div 100);
          p1^.Blue := IntToByte((tB * (100 - alpha) + p2^.Blue * alpha) div 100);
        end;
      end;
      Image.UnlockBits(Data1);
      Src.UnlockBits(Data2);
    end;var
    img,Src:TGPBitmap;    Src  :=  TGPImage.Create('d:\test.png'); 
        Conver32To24(img, Src, clWhite);
        GetEncoderClsid('image/jpeg',  encoderClsid); 
        img.Save('test.jpg',  encoderClsid); 
        img.Free; 
        src.free ;
      

  7.   


    type
      PRGBAType = ^TRGBAType;
      TRGBAType = record
        Red: Byte;
        Green: Byte;
        Blue: Byte;
        Alpha: Byte;
      end;
      PRGBType = ^TRGBType;
      TRGBType = record
        Red: Byte;
        Green: Byte;
        Blue: Byte;
      end;function IntToByte(i: Integer): Byte;
    begin
      if i > 255 then
        Result := 255
      else if i < 0 then
        Result := 0
      else
        Result := i;
    end;
    忘记贴了,补上