Autor Beitrag
demdem
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Mi 05.11.08 18:33 
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
ausblenden 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 // Matrix 1
for y := 0 to form4.Image2.height div 8 do
Form4.Image2.Canvas.Pixels[x,y]:= 0end
else
begin
for x := 0 to form4.Image2.Width div 8 do // Matrix 1
for y := 0 to form4.Image2.height div 8 do
Form4.Image2.Canvas.Pixels[x,y]:= 16777215end ;

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 ... :( :

ausblenden 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 // Matrix 1
for y := 0 to form4.Image2.height div 4 do
Form4.Image2.Canvas.Pixels[x,y]:= 0end
else
begin
for x := s-1 * Form4.Image1.width div 4 to s *form4.Image2.Width div 4 do // Matrix 1
for y := 0 to form4.Image2.height div 4 do
Form4.Image2.Canvas.Pixels[x,y]:= 16777215end ;

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 user profile iconGausi: Delphi-Tags hinzugefügt
Chryzler
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1097
Erhaltene Danke: 2



BeitragVerfasst: 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. ;)
ausblenden 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 und hier im Forum: Suche in: Delphi-Forum, Delphi-Library SCANLINE
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 480

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Mi 05.11.08 19:14 
So würde ich das erstmal ganz grob angehen...Optimal ist aber was anderes. ;-)

ausblenden 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
    // Ein Quadrat betrachten
    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;

_________________
We are, we were and will not be.
demdem Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: 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 !! :)
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19341
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 06.11.08 01:43 
Deutlich schneller ist es, wenn du mit ScanLine arbeitest statt direkt auf Pixels zuzugreifen.
www.delphi-forum.de/...+Scanline_86075.html
demdem Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: 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