Skalowanie zdjęcia z przezroczystością

0

Hej
mam problem ze zmianą rozmiaru zdjęcia tak aby zachować przezroczyste tło. Plik mam w formacie PNG. Kiedy zmienię rozmiar zdjęcia, przezroczyste tło staje się czarne. Googlowałem ale nie mogę znaleźć działającego rozwiązania, które korzystałoby ze standardowych bibliotek.

Robię to w ten sposób:

var
  img1,img2:TPortableNetworkGraphic;
begin

  img1:=TPortableNetworkGraphic.Create();
  img1.LoadFromFile('C:\pika.png');

  img2:=TPortableNetworkGraphic.Create();
  img2.Width:=100;
  img2.Height:=100;
  img2.Canvas.StretchDraw(RECT(0,0,img2.Width,img2.Height), img1);

  PaintBox1.Canvas.Draw(0,0,img1);
  PaintBox1.Canvas.Draw(250,0,img2);

end;

W efekcie otrzymuję:

screenshot-20181124081329.png

Dodatkowo spada strasznie jakość. Czy możecie mi podpowiedzieć jak to ogarnąć albo zaproponować inne rozwiązanie ? Chciałbym nie korzystać z dodatkowych bibliotek a ogarnąć najprościej jak się da.

Nie zależy mi na tym żeby zdjęcie zapisać tylko wyświetlić na TPaintBox.

Proszę o pomoc:)

2

http://cc.embarcadero.com/Item/25631

i kilka słów o tym rozwiązaniu - https://stackoverflow.com/questions/2437714/resize-png-image

Czy to jest OK? Wiem, że jest to dodatkowa biblioteka, ale nie widzę problemu w jej wykorzystaniu, licencja niczego nie zabrania, nie wiem po co wynajdować koło na nowo :P Chyba, że masz jakieś konkretne powodu, dla których NIE MOŻESZ z niej skorzystać - w takim razie podziel się nimi.

2

Dzięki za pomoc.

Na początku zrezygnowałem z PNG i bawiłem się bitmapami i tworzeniem przezroczystości z koloru. Wszytko działało poprawnie ale niestety jakoś była średnia. Postanowiłem więc skorzystać z dodatkowej biblioteki ;) Ponadto wykorzystałem pliki svg dzięki czemu nie tracę na jakości jakich bym rozmiarów nie ustawił. Poniżej przykład dla potomnych:

Biblioteka: BGRABitmap;
Pobieranie: https://github.com/bgrabitmap/bgrabitmap/releases
Info: wiki.freepascal.org/BGRABitmap

Przykład zmiany rozmiaru i wyświetlenia grafiki w svg:

uses
BGRABitmap, BGRASVG;

(...)

Var
  bmp: TBGRABitmap;
  svg: TBGRASVG;
begin
   bmp:= TBGRABitmap.Create;

   svg:= TBGRASVG.Create('C:\test.svg');

   bmp.SetSize(20,20);

   svg.StretchDraw(bmp.Canvas2D, taCenter, tlCenter, 0,0,20,20);

   PaintBox1.Canvas.Draw(0,0,bmp.Bitmap);

end;

1 użytkowników online, w tym zalogowanych: 0, gości: 1