AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Maximale Stack Größe reicht nicht

Ein Thema von kub · begonnen am 8. Mär 2010 · letzter Beitrag vom 10. Mär 2010
Antwort Antwort
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.393 Beiträge
 
Delphi 12 Athens
 
#1

Re: Maximale Stack Größe reicht nicht

  Alt 9. Mär 2010, 12:28
Delphi-Quellcode:
Procedure SearchAreas(Threshold: Byte; Image, Map: TBitMap);
  Var LastArea, X, Y, C, C2: Integer;

  Begin
    Map.PixelFormat := pf24bit;
    Map.Width := Image.Width;
    Map.Height := Image.Height;
    Map.Canvas.Brush.Style := bsSolid;
    Map.Canvas.Brush.Color := 0;
    Map.Canvas.FillRect(Rect(0, 0, Map.Width, Map.Height));
    LastArea := 0;
    For Y := 0 to Image.Height - 1 do
      For X := 0 to Image.Width - 1 do
        If GrayScale(Image.Canvas.Pixels[X, Y]) < Threshold Then Begin
          If Y > 0 Then C := Map.Canvas.Pixels[X, Y - 1] Else C := 0;
          If C <> 0 Then Begin
            Map.Canvas.Pixels[X, Y] := C;
            If X > 0 Then C2 := Map.Canvas.Pixels[X - 1, Y] Else C2 := 0;
            If (C2 <> 0) and (C2 <> C Then Begin
              Map.Canvas.Brush.Color := C;
              Map.Canvas.FloodFill(X - 1, Y, C2, fsSurface);
            End;
            Continue;
          End;

          If X > 0 Then C := Map.Canvas.Pixels[X - 1, Y] Else C := 0;
          If C <> 0 Then Begin
            Map.Canvas.Pixels[X, Y] := C;
            Continue;
          End;

          Inc(LastArea);
          If LastArea = $01000000 Then Raise EOutOfResources.Create('too many areas');
          Map.Canvas.Pixels[X, Y] := LastArea;
        End;
  End;
Jetzt müßte in Map ein Image entstehen, welches alle zusammenhängenden Blöcke enthält

Delphi-Quellcode:
// kein zusammenhängender Bereich in/an diesem Pixel
Map.Canvas.Pixels[X, Y] = 0

// hier ist einer und alle Pixel mit dem selben Farbwert gehören dazu
Map.Canvas.Pixels[X, Y] <> 0
Hier werden zwar auch erstmal die 2 genannten Bereiche getrennt aufgeführt, aber sobald ein Zusammenhang erkannt wird, wird per FloodFill ein Zusammenhang geschaffen.

(FloodFill deswegen, weil es diesen Bereich schneller umfärben kann, als man es manuell via Pixels könnte)

PS: Ich hoffe mal 16777215 verschiedene Indize für die Bereiche reichen aus.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:39 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