Bitmapa-Zoom
Piotrekdp
Dawno temu myślałem nad tym jak zrobić zoom bitmapy i wymyśliłem...
Objaśniam parametry:
- Bitmap - Bitmapa którą powiększam
- CanvasTarget- Canvas na którym rysuje powiększoną bitmapę
- Zoom- jeśli dodatni powiększa / jesli ujemny pomniejsza
- BitmapLeft - fragment bitmapy od lewej
- BitmapTop - fragment od góry
- ClientX, ClientY- rozmiary okna na którym rysujemy {kod nadaje sie do aplikacji które powiększoną bitmapę rysują na całym oknie } mała uwaga jeżeli mają być "belki" góra/dół i lewo/ prawo to ClientX,ClientY pomniejszamy o wysokość belek
Przy powiększaniu kod wycina fragment bitmapy mniejszy o zoom i tyle samo go rozciągamy przy rysowaniu
przy pomniejszaniu używa StretchDraw.
var
ZoomBmp : TBitmap; // bitmapa robocza do rysowania w pamięci
procedure BMPEffect.zoom(Bitmap:TBitmap; CanvasTarget:TCanvas; Zoom:Shortint; BitmapLeft, BitmapTop, ClientX, ClientY:integer);
begin
try
ZoomBmp:=TBitmap.Create;
ZoomBmp.Canvas.Brush.Color := clBtnFace;//kolor na jaki ma być wypełniony obszar poza bitmapą
ZoomBmp.Width := ClientX;
ZoomBmp.Height := ClientY;
if Zoom = 0 then Zoom:=1;
if Zoom > 0 then
begin
ZoomBmp.Canvas.CopyRect(Rect(0, 0, ClientX, ClientY), Bitmap.Canvas, Rect(Bitmapleft,BitmapTop, BitmapLeft+(ClientX div Zoom), BitmapTop+(ClientY div zoom)));
end else
begin
ZoomBmp.Canvas.StretchDraw(Rect(-BitmapLeft, -BitmapTop, (Bitmap.Width) div (Zoom*-1)-BitmapLeft,Bitmap.Height div (Zoom*-1)-BitmapTop), Bitmap);
CanvasTarget.Draw(0,0,ZoomBmp);
finally
ZoomBmp.Free;
end;
end;
Program wykorzystujący zoom mojej produkcji:
http://www.piotrekdp.cba.pl/SuperDraw.rar