Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Pixel Werte effizient lesen ! aber wie ??? :|
demdem - Mi 05.11.08 18:33
Titel: Pixel Werte effizient lesen ! aber wie ??? :|
Hallo Alle zusammen :)
Ich hoffe, dass Ihr mir weiterhelfen könnt und bedanke mich im Voraus für jede Bemühung oder Tipp oder Code :D ..
naja ,
Mein problem : ich habe BildNr.1 ( Monochrom --> Schwarz und Weiss, d.h. nur 2 PixelWerte( 0 und 16777215)) in eine 8*8 Matrix aufgeteilt. Sooo nun möchte ich die Summe aller Pixelwerte in EINEM Quadrat des BildesNr.1 lesen ( z.B. Quadrat 1 1 , Quadrat 1 2 .... Quadrat 8 8 . Insgesamt sind es 64 Einzelquadrate].
Nachdem ich die Summe bekomme, will ich verglichen ob diese überprüfen ob sie eine bestimmte Schwelle überschreitet ...
Wenn Ja, dann soll das ganze Quadrat Schwarz bzw. Weiss werden...
Also ich habe das problem eigentlich schon gelöst aber gaaanz unelegant... Indem ich für jeden Quadrat einen Code gegeben habe : bsp :
// Zu Matrix 1
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| for x1 := 0 to Form4.Image1.Width div 8 do begin for y1:= 0 to Form4.Image1.Height div 8 do begin
zw1:=zw1+Form4.Image1.Canvas.Pixels[x1,y1];
SR1:=zw1 ; end; end; if SR1< 16777215*0.5*(form4.Image1.Width div 8 )*(form4.Image1.height div 8 ) then begin for x := 0 to form4.Image2.Width div 8 do for y := 0 to form4.Image2.height div 8 do Form4.Image2.Canvas.Pixels[x,y]:= 0; end else begin for x := 0 to form4.Image2.Width div 8 do for y := 0 to form4.Image2.height div 8 do Form4.Image2.Canvas.Pixels[x,y]:= 16777215; end ; |
Insgesamt habe ich 64 Codes dieser Art XD ... ( bei einer 16x16 matrix werden es 265 !!!! und darauf hab ich 0 Bock !!)
Deshalb will ich das ganze Procedere irgendwie in einer Schleife noch einpacken, sodass ich wenigsten "etwas" Tipparbeit einspare ...
Ich habs mit folgendem Code probiert ... hat aber leider nicht funktioniert ... :( :
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26:
| for s := 1 to 4 do
begin
for x1 := s-1 * Form4.Image1.Width div 4 to s* Form4.Image1.Width div 4 do begin for y1 := 0 to Form4.Image1.Width div 4 do Zw1:= zw1 + Form4.Image1.Canvas.Pixels[x1,y1]; SR1 := Zw1 ; end;
if SR1 < 16777215*0.5*(form4.Image1.Width div 4 )*(form4.Image1.height div 4 ) then begin for x := s-1 * Form4.Image1.width div 4 to s *form4.Image2.Width div 4 do for y := 0 to form4.Image2.height div 4 do Form4.Image2.Canvas.Pixels[x,y]:= 0; end else begin for x := s-1 * Form4.Image1.width div 4 to s *form4.Image2.Width div 4 do for y := 0 to form4.Image2.height div 4 do Form4.Image2.Canvas.Pixels[x,y]:= 16777215; end ;
zw1:=0; SR1:=0;
end; |
Kann mir Jemand sagen wo der fehler liegt oder einen besseren Vorschlag machen ?? ( bevor ich selber noch zu einer Matrix werde XD )
beste Grüße
Moderiert von
Gausi: Delphi-Tags hinzugefügt
Chryzler - Mi 05.11.08 19:12
Schreib dir eine Prozedur die die beiden Koordinaten des zu berechnenden Quadrats bekommt. Wenn du das hast rufst du diese Prozedur einfach für alle x- und y-Werte von 1 bis 8 auf. Dann sollte das ganze auch etwas übersichtlicher werden. ;)
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
| procedure ColorizeSquare(Bitmap: TBitmap; X: Integer; Y: Integer) var x, y: Integer; x1, y1, x2, y2: Integer; begin x1 = X * (Bitmap.Width div 8); y1 = Y * (Bitmap.Height div 8); x2 = x1 + (Bitmap.Width div 8); y2 = y1 + (Bitmap.Height div 8);
for y := y1 to y2 do for x := x1 to x2 do begin end; end;
procedure ColorizeBitmap(Bitmap: TBitmap) var x, y: Integer; begin for y := 0 to 7 do for x := 0 to 7 do ColorizeSquare(Bitmap, x, y); end; |
Einen enormen Geschwindigkeitsschub bekommst du außerdem, wenn du anstatt
TBitmap.Pixels TBitmap.Scanline verwendest. Mehr Infos dazu gibts u.a.
hier [
http://www.delphi-treff.de/tutorials/grafik-und-spiele/bitmaps/page/2/] und hier im Forum:
SCANLINE
Gausi - Mi 05.11.08 19:14
So würde ich das erstmal ganz grob angehen...Optimal ist aber was anderes. ;-)
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| for x := 0 to Image.width Div 8 do begin for y := 0 to Image.height div 8 do begin blackPixels := 0; for qx:= 1 to 8 do begin for qy := 1 to 8 do begin if Form4.Image2.Canvas.Pixels[8*x + qx, 8*y + qy] = clBlack then inc(blackPixels); end; end; if BlackPixels > Schwellwert then begin end; end; end; |
demdem - Mi 05.11.08 23:38
Ich danke euch sehr für die Hilfreichen Tipps Gausi und Chryzler !!! Hören sich echt gut an die Ideen !!! Ich werde Morgen direkt versuchen sie bei meinem Programm zu implementiren und ich halte euch auf den laufenden wie die Entwicklung läuft !!
schöne Grüße !! :)
demdem - Mo 10.11.08 19:12
Titel: Alles klaro ;)
Leute !!! Das Problem ist gelöst :D ... ich danke euch nochmal sehr für die Hilfreiche Unterstützung !!! Ich hab mir so eine Idee von Chryzler und Gausi zusammengebastelt und dann noch einen hilfreichen Kollegen gefragt und es hat geklappt !!!!!!!!!!! maaan For-Schleifen sind echt zum Kotzen !! ich muss mich aber noch in sie verlieben... Die sind die Basis leider ... Naja ... Scanline hab ich jetzt noch nicht benutzt, aber ich werd da auch versuchen was mit zu machen , also auch ein Danke an jaenicke ;) !!
nadann , haut rein leute und weiter so!! :)
beste Grüße
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!