首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

利用GDI+,将png图像转换为jpg图像时,怎么设置png的透明背景色转换为jpg的白色背景色

2012-03-19 
利用GDI+,将png图像转换为jpg图像时,如何设置png的透明背景色转换为jpg的白色背景色利用GDI+,将png图像转

利用GDI+,将png图像转换为jpg图像时,如何设置png的透明背景色转换为jpg的白色背景色
利用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图片后,就变成黑色的背景色了

问题:如何设置转换的时候能够转换为白色背景色

[解决办法]
提供2段代码供参考:

Delphi(Pascal) code
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;
[解决办法]
Delphi(Pascal) code
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; 

热点排行