Einzelnen Beitrag anzeigen

Opa Knack

Registriert seit: 28. Dez 2004
Ort: Köln
166 Beiträge
 
#1

ImageEn: Ausschnitt/Vergrößerung speichern

  Alt 12. Jul 2016, 01:18
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
  Mit Zitat antworten Zitat