Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi TBitmap nur zusammenhängende Pixel kopieren (https://www.delphipraxis.net/45027-tbitmap-nur-zusammenhaengende-pixel-kopieren.html)

endeffects 28. Apr 2005 11:27


TBitmap nur zusammenhängende Pixel kopieren
 
Hallo,

ich möchte aus einem TBitmap nur Pixel einer Farbe kopieren
die zum selben Objekt gehören, was allerdings gar nicht so einfach ist.
ähnlich dem photoshop werkezug "zauberstab" mit der option "benachbart".

angefangen hab ich nun mit einer methode die das bild von links nach recht
spaltenweise (!) einliest und alle pixel der selben farbe in ein zweites
bitmap kopiert:

Delphi-Quellcode:
  x:= 0;
  while x < CacheBitmap.Width - 1 do
  begin
    for y := 0 to CacheBitmap.Height - 1 do
    begin
      P := CacheBitmap.ScanLine[y];
      for i:= 0 to x do
        inc(P);
      if (P^.rgbRed = 0) and (P^.rgbGreen = 0) and (P^.rgbBlue = 0) then
      begin
        MyRect:= Rect(x, y, SmartBitmap.Height-1, SmartBitmap.Width-1);
        MyOther:= Rect(x,y,SmartBitmap.Height-1, SmartBitmap.Width-1);
        SmartBitmap.Canvas.CopyRect(MyOther,CacheBitmap.Canvas,MyRect);
      end;
    end;
    inc(x);
  end;
zusätzlich habe ich auch schon mit einem zweiten pointer experimentiert,
der den nächst liegenden rechten pixel mit dem aktuellen vergleicht.
mein problem allerdings bleibt bestehen, wie erkenne ich wann welcher
pixel zur selben form gehört. hat da jemand vielleicht eine idee?

ein gutes beispiel um das zu veranschaulichen wäre z.B. das 'E' und die '3'.
von links nach recht gelesen fällt es besonders bei der '3' schwer die pixel zu zuordnen.

mfg

dizzy 28. Apr 2005 11:43

Re: TBitmap nur zusammenhängende Pixel kopieren
 
Das riecht für mich nach einer Rekursion. In etwa so: (Pseudocode)
Delphi-Quellcode:
var
  Pixelliste: TList (oder ähnliches);

procedure MakePixellist(x, y: Integer {Startpunkt}; c: TColor);
begin
  if PixelIstNichtInListe then
  begin
    if FabeAtXY = c then
    begin
      PackeXYinDieListe;
      MakePixellist(x+1, y , c);
      MakePixellist(x , y+1, c);
      MakePixellist(x-1, y , c);
      MakePixellist(x , y-1, c);
    end;
  end;
end;
So in etwa müsstest du an alle zusammenhängenden Pixel einer Farbe ausgehend vom Startpixel heran kommen.

Gruss,
Fabian

shmia 28. Apr 2005 12:32

Re: TBitmap nur zusammenhängende Pixel kopieren
 
Kuck mal da:
http://www.efg2.com/Lab/Graphics/Colors/ColorRange.htm
da kriegst du mehr als du eigentlich wolltest. :???:
[edit]vielleicht doch nicht, denn du wolltest ja nur zusammenhängende Flächen [/edit]

endeffects 28. Apr 2005 12:48

Re: TBitmap nur zusammenhängende Pixel kopieren
 
über eine art landkarte hab ich auch schon nachgedacht,
fehlt mir leider die erfahrung für :(

trotzdem danke euch beiden

dizzy 3. Mai 2005 10:21

Re: TBitmap nur zusammenhängende Pixel kopieren
 
Das Thema hier klingt diesem doch recht ähnlich ;).

DP-Maintenance 3. Mai 2005 10:28

DP-Maintenance
 
Dieses Thema wurde von "sakura" von "Object-Pascal / Delphi-Language" nach "Multimedia" verschoben.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:43 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