Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Bitmap automatisch "beschneiden" (https://www.delphipraxis.net/78466-bitmap-automatisch-beschneiden.html)

Aenogym 5. Okt 2006 14:21


Bitmap automatisch "beschneiden"
 
Hi Leute,

Man stelle sich ein Monochrom-Bitmap vor, dass ringsherum von wießen Pixeln umgeben ist. Diesen Überhang möchte ich nun rausschneiden, sodass die Bitmap-Dimensionen auf ein Minimum reduziert werden.
Kennt Ihr eine Möglichkeit, den Inhalt dieses Bitmap automatisch zu beschneiden?

Ich habe schon versucht, von links, von unten, von rechts und von oben per while-Schleife die Pixel durchzugehen etc. Aber erstens ist das ziemlich langsam und zweitens komm ich nicht draauf, wie ich das Bitmap dann letztendlich beschneide.

Dake im Voraus für Antworten,
aeno

Corpsman 5. Okt 2006 14:28

Re: Bitmap automatisch "beschneiden"
 
Mir fällt auch nur deine While version ein.

Wenn du aber dann die Linien hast, dann mus du nur noch via CopyRect den restlichen bereich in ein TMP bild Kopieren und hast dann das was du willst.

Ich hoffe mal das du nicht via Canvas.Pixels arbeitest. Mache es mit Scanline nud Scanrow,das ist dann schneller.

Aenogym 5. Okt 2006 15:22

Re: Bitmap automatisch "beschneiden"
 
Ja, so mit CopyRect() -oder BitBlt()- dachte ich mir das auch. Nur ich komm einfach nicht an die Linien ran... Da ich ScanLine() nutze, bekomme ich nur die obere und die untere Linie. So etwas wie ScanRow() gibt es nämlich leider nicht :(

aeno

Der_Unwissende 5. Okt 2006 15:34

Re: Bitmap automatisch "beschneiden"
 
Hi,
was Scanrow angeht, so könntest du sehr einfach einen Algorithmus nehmen, der das Bild um 90° dreht und dann mit Scanline arbeiten. Würde sich aber die Frage stellen, ob das nötig ist.
Mit Scanline bekommst du ja eine komplette Zeile (einen Zeiger auf den Anfang der Zeile). Wie du prüfst ob die ganz leer ist, dürfte klar sein, damit hast du dann deine obere und untere Begrenzung.
Links und rechts kannst du aber im gleichen Durchgang berechnen. Du gehst einfach von oben nach unten durch die Bitmap, liest eine Zeile ein, wenn diese nicht komplett weiß ist, dann gibt einen Punkt der am weitesten links liegt, der schwarz ist und einen der am weitesten rechts liegt. Diese merkst du dir.
An sich musst du also nur schauen, welcher Wert die kleinste x Position darstellt und welcher die Größte, wobei dies dann den rechten bzw. linken Rand angibt. Natürlich gilt das nur für nicht leere Zeilen.

Gruß Der Unwissende

SirThornberry 5. Okt 2006 16:13

Re: Bitmap automatisch "beschneiden"
 
Scanline gibt dir einen Pointer auf die Bitmap-Daten der entsprechenden Zeile. Innerhalb der Zeile setzt du deinen Pointer doch auch weiter und arbeitest nicht durchweg auf dem linken Pixel worauf der Pointer zeigt. Genau so kannst du den Pointer auch Zeilenweise incrementieren bzw. Scanline für jede Zeile nochmal aufrufen.

Aenogym 5. Okt 2006 19:48

Re: Bitmap automatisch "beschneiden"
 
Ich danke euch. Jetzt hab ichs auch hinbekommen :)

aeno


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:29 Uhr.

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