Sve*_*sli 1 delphi graphics png
当我使用位图调用canvas.stretchdraw时,当左>右时,位图将被镜像/翻转.PNG不会发生这种情况.这是一个错误吗?我该怎么办才能修复它?
要复制,请尝试以下代码:
procedure TForm1.TestStretchdraw;
var
vBMP: TBitmap;
vPNG: TPNGImage;
X0,Y0,X1,Y1 : integer;
R : TRect;
procedure FlipRect;
var
T : integer;
begin
T := R.Left;
R.Left := R.Right;
R.Right := T;
end;
begin
vBMP := TBitmap.Create;
vPNG := TPNGImage.Create;
try
vBMP.LoadFromFile('c:\temp\pic\pic.bmp');
vPNG.LoadFromFile('c:\temp\pic\pic.png');
X0 := 0;
Y0 := 0;
X1 := X0 + vBMP.Width;
Y1 := Y0 + vBMP.Height;
R := Rect(X0,Y0,X1,Y1);
FlipRect;
Canvas.StretchDraw(R,vBMP); //This image will be drawn mirrored
X0 := vBMP.Width+10;
Y0 := 0;
X1 := X0 + vPNG.Width;
Y1 := Y0 + vPNG.Height;
R := Rect(X0,Y0,X1,Y1);
FlipRect;
Canvas.StretchDraw(R,vPNG); //This will not
finally
vPNG.Free;
vBMP.Free;
end;
end;
Run Code Online (Sandbox Code Playgroud)
(但用你自己的一些替换我的testimages)
在这里,我编写了一个函数,它可以在没有像Gr32这样的库的情况下翻转png.透明度仍然在翻转的PNG中.
procedure FlipPNG(aSource, aDest: TPngImage);
var
X, Y: Integer;
AlphaPtr: PByteArray;
RGBLine: pRGBLine;
PalleteLine: PByteArray;
AlphaPtrDest: PByteArray;
RGBLineDest: pRGBLine;
PalleteLineDest: PByteArray;
begin
aDest.Assign(aSource);
if (aSource.Header.ColorType = COLOR_PALETTE) or
(aSource.Header.ColorType = COLOR_GRAYSCALEALPHA) or
(aSource.Header.ColorType = COLOR_GRAYSCALE) then
begin
for y := 0 to aSource.Height - 1 do
begin
AlphaPtr := aSource.AlphaScanline[y];
PalleteLine := aSource.Scanline[y];
AlphaPtrDest := aDest.AlphaScanline[y];
PalleteLineDest := aDest.Scanline[y];
for x := 0 to aSource.Width - 1 do
begin
PalleteLineDest^[aSource.Width - x -1] := PalleteLine^[x];
if Assigned(AlphaPtr) then
AlphaPtrDest^[aSource.Width - x -1] := AlphaPtr^[x];
end;
end;
end else
if (aSource.Header.ColorType = COLOR_RGBALPHA) or
(aSource.Header.ColorType = COLOR_RGB) then
begin
for y := 0 to aSource.Height - 1 do
begin
AlphaPtr := aSource.AlphaScanline[y];
RGBLine := aSource.Scanline[y];
AlphaPtrDest := aDest.AlphaScanline[y];
RGBLineDest := aDest.Scanline[y];
for x := 0 to aSource.Width - 1 do
begin
RGBLineDest^[aSource.Width - x -1] := RGBLine^[x];
if Assigned(AlphaPtr) then
AlphaPtrDest^[aSource.Width - x -1] := AlphaPtr^[x];
end;
end;
end;
end;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1861 次 |
| 最近记录: |