![]() |
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 |
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. |
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 |
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 |
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.
|
Re: Bitmap automatisch "beschneiden"
Ich danke euch. Jetzt hab ichs auch hinbekommen :)
aeno |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:15 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 by Thomas Breitkreuz