AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Code Optimierung: floodfill innerhalb 1/10 sek
Thema durchsuchen
Ansicht
Themen-Optionen

Code Optimierung: floodfill innerhalb 1/10 sek

Ein Thema von mr_emre_d · begonnen am 15. Jun 2008 · letzter Beitrag vom 16. Jun 2008
Antwort Antwort
Seite 2 von 3     12 3      
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#11

Re: Code Optimierung: floodfill innerhalb 1/10 sek

  Alt 16. Jun 2008, 01:05
Scanline ist immer schneller als Pixels[]. Du solltest es mal messen, statt es zu vermuten/glauben. (Man sollte sich halt nur nicht für jedes Pixel eine neue Scanline holen )
Die Graphics32 sind jedoch mMn immer die bessere Alternative zu TBitmap/TImage/etc., nicht nur weil sie auch ohne Verrenkungen schon sehr fix sind, sondern weil du auch gleich eine ganze Menge an Funktionsumfang dabei hast, den ich zumindest sonst schon an diversen Ecken vermisst hätte, und wo sich der Aufwand des Selberschreibens oftmals kaum gelohnt hätte.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#12

Re: Code Optimierung: floodfill innerhalb 1/10 sek

  Alt 16. Jun 2008, 08:44
http://www.torry.net/vcl/graphics/ef...aphic32Grf.zip
Markus Kinzler
  Mit Zitat antworten Zitat
mr_emre_d
(Gast)

n/a Beiträge
 
#13

Re: Code Optimierung: floodfill innerhalb 1/10 sek

  Alt 16. Jun 2008, 09:23
Ihr bringt mich auf neue Ideen... Das Schlafen hat sich doch ausgezahlt

MfG Franz
  Mit Zitat antworten Zitat
mr_emre_d
(Gast)

n/a Beiträge
 
#14

Re: Code Optimierung: floodfill innerhalb 1/10 sek

  Alt 16. Jun 2008, 09:32
Code:
var
  aBmp: Array of TRGBTriple

procedure form1.imgOnLoad
begin
  SetLength( aBmp, bmp.height );
end;

proc. blablablablablabla....;
begin
  1. speichere alles ins array
  2. suche im array nach bestimmten wert und tu was du wills damit !
end;
so ca müsste es schneller sein oder ?

edit:
omfg, es geht... ich bin sicher nur wegen der Schlaflosigkeit nicht draufgekommen ...

Vielen Dank !

Ich liebe Delphipraxis.net ! Meine Lieblingsseite ! Klasse Design, Klasse Mods., Klasse Leute... N kleiner Dank von mir an euch !

edit2:
Nun gehts wieder nicht mehr... Ich hab einfach so zum Probieren einen Code compiliert... ging auch... dann ein wenig umgändert und jetzt gehts nicht mehr.. das Problem ist ich weiß nicht was ich umgeändert hab..

MfG Franz
  Mit Zitat antworten Zitat
mr_emre_d
(Gast)

n/a Beiträge
 
#15

Re: Code Optimierung: floodfill innerhalb 1/10 sek

  Alt 16. Jun 2008, 17:21
Ich hätte da noch ne Frage ( zu ^TRGBTriple, also dazu gehört ):

Mit Scanline ermittelman ja die Anfangsposition !
Mit inc geht man stückweiße nach rechts, sag ich mal !

Wie kann ich aber bestimmte sprüng nach rechts UND links machen ? und bitte nicht mit inc, dec sagen !
Kann ich die Position beliebig setzten ?


Das wärs schon
Danke
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#16

Re: Code Optimierung: floodfill innerhalb 1/10 sek

  Alt 16. Jun 2008, 17:27
Du musst die OH genau lesen: ScanLine ist einfach nur ein ^TByteArray in eine Zeile des Bildes. Was da genau steht, ist vom Bildformat abhängig. Wenn Du ein 24bit Bild hast, sind das lauter TRGBTriple-Werte, also kannst Du einfach ein entsprechendes Array deklarieren und direkt jedes Pixel ansprechen:
Delphi-Quellcode:
Type
  TRGBLine = Array [0..0] Of TRGBTriple; // Achtung! Mit {$RANGECHECKS OFF} kompilieren
  PRGBLine = ^TRGBLine;

...
Var
  pPixelLine : PRGBLine;

Begin
  pPixelLine := PRGBLine (MyBitmap.ScanLine[x]);
// pPixelLine^[25] ist nun das 26.Pixel von Links (wenn MyBitmap eine 24bit Bitmap ist)
...
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
mr_emre_d
(Gast)

n/a Beiträge
 
#17

Re: Code Optimierung: floodfill innerhalb 1/10 sek

  Alt 16. Jun 2008, 17:30
das weiß ich doch schon

mit scanline kann man die einzelnen farben ausrechnen auf der y achse ausrechnen
und mit inc( rgb ) = ^trgbtriple der x wert eine stelle nach rechts ( so sag ich das, stimmt vlt nicht, da ich grad gelesen hab, dass es verkehrt herum gespeicher wird usw....)

wie positioniere ich es nach beliebenb ????
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#18

Re: Code Optimierung: floodfill innerhalb 1/10 sek

  Alt 16. Jun 2008, 17:32
Du kannst auch auf das gesamte Bitmap mit einer Scanline zugreifen, da du mit SizeOf(TRGBTriple)*Bitmap.Width eine ganze Zeile springst. Es wird jedoch immer mal wieder darauf hingewiesen, dass Bitmaps im Speicher nicht immer gleich vorliegen. Normalerweise sind sie "falsch herum", sprich mit der letzten Zeile zu erst hinterlegt, es kann aber durchaus mal sein, dass es genau anders herum ist. Wann das so ist, war IIRC nicht ohne weiteres feststellbar.
Der sichere Weg wäre also sich trotz dessen für jede Zeile die Scanline neu geben zu lassen, ich rate aber weiterhin zur Graphics32

Edit: Das hat alzaimar doch gerade gezeigt
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
mr_emre_d
(Gast)

n/a Beiträge
 
#19

Re: Code Optimierung: floodfill innerhalb 1/10 sek

  Alt 16. Jun 2008, 17:36
achso... ich hab mir den code nicht angeschaut..

thx

ich probiers mal

EDIT: alzaimer

Ich versteh deinen Code nicht .. und zwar genau die Stelle:

Code:
pPixelLine := PRGBLine (MyBitmap.ScanLine[x]);
und das

Code:
SizeOf(TRGBTriple)*Bitmap.Width
auch nicht ...

EIDT2: Das von Alzaimer funktioniert wunderbar, nur will ich es auch gerne verstehen !
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#20

Re: Code Optimierung: floodfill innerhalb 1/10 sek

  Alt 16. Jun 2008, 18:13
Am schnellsten gehts, wenn Du die ganze TBitmap Sch... wegläßt und direkt mit TDIBSection arbeitest. Dann kannnst Du Dir die für den speziellen Anwendungsfall hochoptimierten Zugriffe auf das Bitmap im Speicher ohne Overhead erstellen.
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 13:03 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