두 PNG를 병합하는 방법은 무엇입니까? 알파 전달을 복사하지 않기 때문에 PNGObject.Draw
을 사용할 수 없다는 것을 알고 있습니다. 확실하지는 않지만 어쨌든 작동하지 않습니다. 따라서 사용자 정의 프로 시저/함수가 필요합니다. 내가 빈 손와 함께 제공되지 않은,이 절차가 있습니다다른 PNG의 PNG 이미지 그림
procedure MergePNGLayer(Layer1,Layer2: TPNGObject; Const aLeft,aTop:Integer);
var
x, y: Integer;
SL1, SL2, SLBlended : pRGBLine;
aSL1, aSL2, aSLBlended: PByteArray;
blendCoeff: single;
blendedPNG, Lay2buff: TPNGObject;
begin
blendedPNG:=TPNGObject.Create;
blendedPNG.Assign(Layer1);
Lay2buff:=TPNGObject.Create;
Lay2buff.Assign(Layer2);
SetPNGCanvasSize(Layer2,Layer1.Width,Layer1.Height,aLeft,aTop);
for y := 0 to Layer1.Height-1 do
begin
SL1 := Layer1.Scanline[y];
SL2 := Layer2.Scanline[y];
aSL1 := Layer1.AlphaScanline[y];
aSL2 := Layer2.AlphaScanline[y];
SLBlended := blendedPNG.Scanline[y];
aSLBlended := blendedPNG.AlphaScanline[y];
for x := 0 to Layer1.Width-1 do
begin
blendCoeff:=aSL1[x] * 100/255/100;
aSLBlended[x] := round(aSL2[x] + (aSL1[x]-aSL2[x]) * blendCoeff);
SLBlended[x].rgbtRed := round(SL2[x].rgbtRed + (SL1[x].rgbtRed-SL2[x].rgbtRed) * blendCoeff);
SLBlended[x].rgbtGreen := round(SL2[x].rgbtGreen + (SL1[x].rgbtGreen-SL2[x].rgbtGreen) * blendCoeff);
SLBlended[x].rgbtBlue := round(SL2[x].rgbtBlue + (SL1[x].rgbtBlue-SL2[x].rgbtBlue) * blendCoeff);
end;
end;
Layer1.Assign(blendedPNG);
Layer2.Assign(Lay2buff);
blendedPNG.Free;
Lay2buff.Free;
end;
을하지만 슬프게도, 그것은 작업하지만 잘되지를 않습니다 어떻게해야 작동하지 않습니다. 빈 이미지를로드 된 이미지와 병합하면 잘 작동하지만 두 이미지가 모두 비어 있지 않으면 손실이 발생합니다.
procedure TForm1.FormClick(Sender: TObject);
var
PNG1, PNG2, PNG3, Dest: TPNGObject;
begin
PNG1 := TPNGObject.Create;
PNG2 := TPNGObject.Create;
PNG3 := TPNGObject.Create;
PNG1.LoadFromFile('Aero\TopLeft.png');//Width 10
PNG2.LoadFromFile('Aero\Top.png');//Width 200
PNG3.LoadFromFile('Aero\TopRight.png');//Width 10
Dest := TPNGObject.CreateBlank(COLOR_RGBALPHA, 16, 220, 10);
MergePNGLayer(Dest, PNG1, 0, 0);
MergePNGLayer(Dest, PNG2, 10, 0);
MergePNGLayer(Dest, PNG3, 210, 0);
Dest.SaveToFile('C:\OUT.PNG');
end;
구인 결과 :
실제 결과 :이 imgaes 사이의 차이를 볼 수있는 경우
나는 잘 모르겠지만, 당신은 이러한를 열어야합니다 PNG 편집기 소프트웨어 및 차이점을 볼 수 있습니다. PNG를 병합하려면 다른 절차가 필요합니다. 나는 PNGImage
의 최신 버전을 사용하고 있습니다.
감사합니다. 좋은 하루 되세요!
당신은'비트 깊이 = 16' 4 개 색 채널을 당신이에'CreateBlank' 하시겠습니까? – TLama