利用GDI+,将png图像转换为jpg图像时,怎么设置png的透明背景色转换为jpg的白色背景色
利用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段代码供参考:
利用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;