Hallo,
auf einem Formular habe ich zwei ImageEnViews. Analog zum Magnify-Demo zeige ich in einem View einen Ausschnitt eines Bitmaps aus dem anderen View an:
Delphi-Quellcode:
var
rc: TRect;
ww, hh: integer;
begin
rc.left := xpos - (RectWidth div 2);
rc.top := ypos - (RectHeight div 2);
rc.Right := xpos + (RectWidth div 2);
rc.Bottom := ypos + (RectHeight div 2);
with ImageEnView1 do
begin
rc.Left := XScr2Bmp(rc.Left);
rc.Right := XScr2Bmp(rc.right);
rc.Top := YScr2Bmp(rc.top);
rc.Bottom := YScr2Bmp(rc.bottom);
end;
ww := rc.right - rc.left + 1;
hh := rc.bottom - rc.top + 1;
ImageEnView2.IEBitmap.Allocate(ww, hh, ImageEnView1.IEBitmap.PixelFormat);
ImageEnView1.IEBitmap.CopyRectTo(ImageEnView2.IEBitmap, rc.Left, rc.Top, 0, 0, ww, hh);
ImageEnView2.Update;
ImageEnView2.Fit;
Soweit funktioniert es.
Nun kann ich das Bitmap des zweiten Views (den Ausschnitt) problemlos speichern:
Delphi-Quellcode:
var
io: TImageEnIO;
begin
io := TImageEnIO.Create(self);
io.AttachedBitmap := ImageEnView2.Bitmap;
IO.Params.JPEG_Quality := 100;
IO.SaveToFileJpeg(Dateiname);
io.free;
Solange ich die Skalierung beibehalte, ergeben sich auch keine Probleme. Sobald ich diesen jedoch ändere, wird der Ausschnitt nur noch anteilig in Originalgröße gespeichert.
Wenn ich also zum Beispiel in das Originalbitmap zoome, wird der Ausschnitt entsprechend größer auf dem Formular dargestellt. Will ich diese Vergrößerung nun speichern, wird stattdessen die ursprüngliche Skalierung beibehalten und der Ausschnitt von den Abmessungen her verkleinert (wenn ich hineinzoome, wird das gespeicherte Bitmap entsprechend in Höhe und Breit kleiner, beim Hinauszoomen größer).
Mein Ziel ist es, exakt den Ausschnitt (also die Ausgabe auf dem Formular) zu speichern. Hierzu habe ich x Möglichkeiten durchgetestet, z. B.
Delphi-Quellcode:
io.Params.Width := 480;
io.Params.Height := 800;
oder
io.IEBitmap.Width := 480;
io.IEBitmap.Height := 800;
oder
io.Bitmap.Width := 480;
io.Bitmap.Height := 800;
Ich habe auch schon das Bitmap des zweiten Views in ein neues Bitmap geladen, das View dann geleert und anschließend wieder zurückgelesen - gleiches Ergebnis.
Kann mir jemand einen Tipp geben, wo mein Denkfehler liegt?
Danke und viele Grüße