Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi einfache frage (bestimmt) : Picture zuschneiden (https://www.delphipraxis.net/66653-einfache-frage-bestimmt-picture-zuschneiden.html)

simlei 2. Apr 2006 00:39


einfache frage (bestimmt) : Picture zuschneiden
 
Hallo!
Die Frage ist, wie ich ein als Image gespeichertes Bild zuschneide, sodass eben nur noch ein Rechteck aus diesem Bild übrigbleibt; was ich dann auch als Datei abspeichern kann.
Danke schonmal!

Der_Unwissende 2. Apr 2006 11:14

Re: einfache frage (bestimmt) : Picture zuschneiden
 
Hi,
hierfür gibt es zwei sehr interessante Funktionen, BitBlt und StretchBlt. Letzteres funktioniert fast analog zu BitBlt, aber du könntest dein Bild halt auch strecken/stauchen. Für einen Zuschnitt brauchst du das ja eher nicht. Beide finden sich in der Unit Windows. Ein Rechteck kopierst du wie folgt:

Delphi-Quellcode:
var SourceBitmap : TBitmap;
    TargetBitmap : TBitmap;
    Cut : TRect;
...

begin
  // kopiert das Rechteck Cut aus der SourceBitmap in die TargetBitmap
  // Dabei wird die Größe von TargetBitmap der größe des Ausschnitts angepasst.

  TargetBitmap.Width := Cut.Right - Cut.Left;
  TargetBitmap.Height := Cut.Bottom - Cut.Top;

  BitBlt(TargetBitmap.Canvas.Handle, 0, 0, Cut.Right, Cut.Bottom, SourceBitmap.Canvas.Handle, Cut.Left, Cut.Top, SRCCOPY);
  SourceBitmap.Canvas.Refresh;
end;
Mit SaveToFile kannst du dann natürlich auch das TargetBitmap in ein File speichern. Auf die Bitmap eines Image kannst du mit Image.Picture.Bitmap zugreifen.

Gruß Der Unwissende

marabu 2. Apr 2006 12:38

Re: einfache frage (bestimmt) : Picture zuschneiden
 
Beim Berechnen von Breite und Höhe bitte jeweils noch einen Pixel dazuzählen - ist besser so.

Grüße vom marabu

0NyX 29. Aug 2008 18:48

Re: einfache frage (bestimmt) : Picture zuschneiden
 
Zitat:

Zitat von Der_Unwissende
Hi,
hierfür gibt es zwei sehr interessante Funktionen, BitBlt und StretchBlt. Letzteres funktioniert fast analog zu BitBlt, aber du könntest dein Bild halt auch strecken/stauchen. Für einen Zuschnitt brauchst du das ja eher nicht. Beide finden sich in der Unit Windows. Ein Rechteck kopierst du wie folgt:

Delphi-Quellcode:
var SourceBitmap : TBitmap;
    TargetBitmap : TBitmap;
    Cut : TRect;
...

begin
  // kopiert das Rechteck Cut aus der SourceBitmap in die TargetBitmap
  // Dabei wird die Größe von TargetBitmap der größe des Ausschnitts angepasst.

  TargetBitmap.Width := Cut.Right - Cut.Left;
  TargetBitmap.Height := Cut.Bottom - Cut.Top;

  BitBlt(TargetBitmap.Canvas.Handle, 0, 0, Cut.Right, Cut.Bottom, SourceBitmap.Canvas.Handle, Cut.Left, Cut.Top, SRCCOPY);
  SourceBitmap.Canvas.Refresh;
end;
Mit SaveToFile kannst du dann natürlich auch das TargetBitmap in ein File speichern. Auf die Bitmap eines Image kannst du mit Image.Picture.Bitmap zugreifen.

Gruß Der Unwissende

Guten Abend,

ich wollte soeben die Funktion verwenden, jedoch bekomme ich dabei immer eine Zugrifssverletzung und ich weiß nicht warum :(
Ich würde mich freuen wenn jemand von euch mal bitte drüber schauen würde, vielen Dank im voraus!

Code:
Delphi-Quellcode:
procedure TfmMain.zuschneiden;
var SourceBitmap : TBitmap;
    TargetBitmap : TBitmap;
    Cut : TRect;
begin
  // kopiert das Rechteck Cut aus der SourceBitmap in die TargetBitmap
  // Dabei wird die Größe von TargetBitmap der größe des Ausschnitts angepasst.
  SourceBitmap.Create;
  TargetBitmap.Create;
  SourceBitmap.LoadFromFile('C:\Users\Davide\Documents\bild1.bmp');
  Cut.Left := 50;
  Cut.Top := 500;
  Cut.Right := 500;
  Cut.Bottom := 100;

  TargetBitmap.Width := Cut.Right - Cut.Left;
  TargetBitmap.Height := Cut.Bottom - Cut.Top;

  BitBlt(TargetBitmap.Canvas.Handle, 0, 0, Cut.Right, Cut.Bottom, SourceBitmap.Canvas.Handle, Cut.Left, Cut.Top, SRCCOPY);
  SourceBitmap.Canvas.Refresh;
  TargetBitmap.SaveToFile('C:\Users\Davide\Documents\bild2.bmp');
end;

MfG 0NyX

Pfoto 29. Aug 2008 19:07

Re: einfache frage (bestimmt) : Picture zuschneiden
 
Du musst die Bitmaps noch erstellen:

Delphi-Quellcode:
SourceBitmap:= TBitmap.Create;
  TargetBitmap:= TBitmap.Create;
Edit:
und freigeben nicht vergessen, deshalb besser
in einem try finally block, etwa so:

Delphi-Quellcode:
  SourceBitmap:= TBitmap.Create;
  TargetBitmap:= TBitmap.Create;
  try
    // Hier was tun...
  finally
    SourceBitmap.Free;
    TargetBitmap.Free;
  end;
Gruß
Jürgen

0NyX 29. Aug 2008 19:22

Re: einfache frage (bestimmt) : Picture zuschneiden
 
Guten Abend Jürgen,

vielen Dank für deine Hilfe :)

Jedoch tritt jetzt ein neuer Fehler auf:
Zitat:

Im Projekt ist eine Exzeption der Klasse EOutOfRessources aufgetreten.
Meldung: Falscher Parameter
:(

Gruß David

mkinzler 29. Aug 2008 19:23

Re: einfache frage (bestimmt) : Picture zuschneiden
 
Und in welcher Zeile?

0NyX 29. Aug 2008 19:39

Re: einfache frage (bestimmt) : Picture zuschneiden
 
Zitat:

Zitat von mkinzler
Und in welcher Zeile?

In dieser Zeile:
Delphi-Quellcode:
TargetBitmap.Height := Cut.Bottom - Cut.Top;

mkinzler 29. Aug 2008 19:41

Re: einfache frage (bestimmt) : Picture zuschneiden
 
Ist ja auch negativ!

0NyX 29. Aug 2008 19:48

Re: einfache frage (bestimmt) : Picture zuschneiden
 
ahja stimmt :-[

Schuldige :(

Vielen Dank für eure Hilfe!

Klappt nun alles!


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:24 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz