利用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图片后,就变成黑色的背景色了问题:如何设置转换的时候能够转换为白色背景色
GetEncoderClsid('image/jpeg', encoderClsid);
TGPBitmap(image).SetResolution(150,50);
image.Save('test.jpg', encoderClsid);
image.Free;
上面只是转换部分的代码,已实现转换,但是转换出现问题:
原来png图片的透明背景色转到jpg图片后,就变成黑色的背景色了问题:如何设置转换的时候能够转换为白色背景色
我换了一种方法转换:GetEncoderClsid('image/jpeg', encoderClsid);
bmp := TGpBitmap.Create(imagepath+'5T9K44.png');
bmp.Save(imagepath+'5T9K44.jpg',encoderClsid);
有的透明色是转换为白色了,但是有的就是直接边黑色了
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;
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 ;
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;
忘记贴了,补上