Witajcie.
Mam problem z zachowaniem (utrzymaniem) przezroczystego tła obrazka png.
Wyjściowo mam obrazek png z przezroczystym tłem (fragment mapy). Następnie dzielę tę mapę na przykład na 2 obrazki png o wysokości równej połowie wysokości obrazka głównego (tnę obrazek w poziomie na 2 równe części). Kolejno uruchamiam 2 wątki, które wykonują operacje na tych 2 plikach. Ostatecznie muszę złożyć to z powrotem w całość - z zachowaniem przezroczystego tła.
I tu ma problem, z którym nie mogę sobie poradzić. Pomimo, że obie części, które chcę złożyć w całość posiadają przezroczyste tło to nie mogę zachować przezroczystości tła po ich złączeniu. A konkretnie:
Poniższy kod generuje pusty obrazek png. Obraz jest całkowicie przezroczysty i pomimo użycia polecenia Draw
obrazek końcowy nie ma ani części dolnej ani górnej :(
procedure MergePngImages;
var
MergedPng, TopPartOfPng, BottomPartOfPng: TPngImage;
begin
TopPartOfPng.LoadFromFile('d:\top.png');
BottomPartOfPng.LoadFromFile('d:\bottom.png');
MergedPng := TPngImage.CreateBlank(COLOR_RGBALPHA, 8, 1200, 1200);
MergedPng.Canvas.Draw(0, 0, TopPartOfPng);
MergedPng.Canvas.Draw(0, 600, BottomPartOfPng);
MergedPng.SaveToFile('d:\map.png');
end;
Próbowałem polecenia MergedPng.RemoveTransparency
. Poniższy kod z RemoveTransparency
sprawia, że górna i dolna część są w końcu widoczne (mały sukces), ale przezroczyste tło obu części wypełniane jest kolorem czarnym.
procedure MergePngImages;
var
MergedPng, TopPartOfPng, BottomPartOfPng: TPngImage;
begin
TopPartOfPng.LoadFromFile('d:\top.png');
BottomPartOfPng.LoadFromFile('d:\bottom.png');
MergedPng := TPngImage.CreateBlank(COLOR_RGBALPHA, 8, 1200, 1200);
MergedPng.Canvas.Draw(0, 0, TopPartOfPng);
MergedPng.Canvas.Draw(0, 600, BottomPartOfPng);
MergedPng.RemoveTransparency; // usuń przezroczystość
MergedPng.SaveToFile('d:\map.png');
end;
W kolejnym podejściu określiłem TransparentColor := clBlack
. Poniższy kod działa już "prawie dobrze", bo otrzymuję przezroczyste tło mapy, ale niestety usunięty jest całowicie czarny kolor - czyli wszytskie napisy i oznaczenia na mape:
procedure MergePngImages;
var
MergedPng: TPngImage;
begin
TopPartOfPng.LoadFromFile('d:\top.png');
BottomPartOfPng.LoadFromFile('d:\bottom.png');
MergedPng := TPngImage.CreateBlank(COLOR_RGBALPHA, 8, 1200, 1200);
MergedPng.Canvas.Draw(0, 0, TopPartOfPng);
MergedPng.Canvas.Draw(0, 600, BottomPartOfPng);
MergedPng.RemoveTransparency; // usuń przezroczystość
MergedPng.TransparentColor := clBlack; // ustaw czarny jako przezroczysty
MergedPng.SaveToFile('d:\map.png');
end;
Bardzo proszę o podpowiedź jak mogę:
- stworzyć obrazek png z przezroczystym tłem
- następnie narysować na nim ("wstawić") inne obrazki png zachowując przezroczyste tło całości po zapisie