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

0 komentarzy