Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - von pixel nach pixel scan zu scanline


Darkpara - So 20.08.06 19:26
Titel: von pixel nach pixel scan zu scanline
hallo

ich hab ein problem. ich hab mir ein kleines programm geschrieben das pixel um pixel vergelicht nun hab ich aber bemerkt das diese methode sehr langsam ist und möchte das ganze mit scanline probieren.

ich hab im forum schon einige informationen dazu gefunden checke die ganze sache allerding nicht so ganz. darum post ich mal den code wie er bis jetzt ist, und währ euch sehr dankbar wenn mir wer das ganze abändern kann also mit scanline einbauen. UND AM WICHTIGSTEN bischen erklären was genau da verändert wurde und was es mit den pointern auf sich hat

danke euch!

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
    for y:= 0 to 240 do begin
    for x:= 0 to 320 do begin
    RGB1:=image1.Canvas.Pixels[x,y];
    RGBtoHSL (RGB1, H1, S1, L1);
    matrix[0,x,y,1]:= H1 ;
    matrix[0,x,y,2]:= S1 ;
    matrix[0,x,y,3]:= L1 ;
    end;
    end;

PS: ich habs immer noch ned kapiert wie man den code in besserer ansicht schreibt, also die kleinen fenster, dass der code halt wie im delphi editor is^^


Marco D. - So 20.08.06 19:38

Du schreibst den Namen deiner Lieblings-Programmiersprache in [] :mrgreen: Und dann das gleiche nochmal, nur dass du dann vor den Namen ein / setzt. Bsp: [dälphi][/dälphi]. Dann bitte mit e schreiben. :zwinker:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
for y:= 0 to 240 do begin
   for x:= 0 to 320 do begin
      RGB1:=image1.Canvas.Pixels[x,y];
      RGBtoHSL (RGB1, H1, S1, L1);
      matrix[0,x,y,1]:= H1 ;
      matrix[0,x,y,2]:= S1 ;
      matrix[0,x,y,3]:= L1 ;
   end;
end;

Außerdem müsstest du mal schreiben was matrix ist, sprich, wie du das deklariert hast.
Scanline arbeitet so:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
var Line: PRGBQuad; r,g,b: byte; color: TColor;
    image1.Bitmap.PixelFormat := pf32Bit;
    //Zeile für Zeile durchgehen
    for y := 0 to Image1.Bitmap.Height - 1 do
    begin
      // Reihe y komplett einlesen, wir sind nun in Spalte 1 (x = 0)
      Line := Image1.Bitmap.ScanLine[y];
      //Die ganze Zeile Pixel für Pixel durchgehen
      for x := 0 to Image1.Bitmap.Width - 1 do
      begin
        //die RGB-Werte auslesen und in TColor umwandeln
        // Farbwert für diesen Pixel setzen
        r := Line.rgbRed;
        g := Line.rgbGreen;
        b := Line.rgbBlue;
        Color := RGB(r,g,b);   
        //den Pointer erhöhen und somit zum nächsten Pixel gehen    
        Inc(Line);
      end;
    end;


Darkpara - So 20.08.06 19:43

ah oki danke :)

zu matrix:

Delphi-Quelltext
1:
matrix :array[0..30of array[0..320of array[0..240of array[1..3of double;                    


array[0..30] = nummer der matrix, da ich je nach bild die matrix mehrfach berechne (0 sind die original werte)

array[0..320] ist die länge der bilder (achse x)
array[0..240] ist die höhe (achse y)
array[1..3] ist für die 3 verschiedenen werte der farben


Darkpara - So 20.08.06 19:46

was ich leider immer noch ned ganz kapier ist, wo füge ich das hier ein


Delphi-Quelltext
1:
2:
3:
4:
      RGBtoHSL (RGB1, H1, S1, L1);  
      matrix[0,x,y,1]:= H1 ;  
      matrix[0,x,y,2]:= S1 ;  
      matrix[0,x,y,3]:= L1 ;


also an welche stelle kann ich die 3 werte r,g,b raus nehmen?


Marco D. - So 20.08.06 19:54

Die Funktion RGBtoHSL kennt mein Delphi nicht. Hat das was mit Helligkeit, Sättigung etc. zu tun? Sind zum Vergleichen nicht die reinen RGB-Werte interessanter?


Heider - So 20.08.06 19:55

Hier mal deine Variante mit Scanline

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:
type
  TRGBColor = record //einfacher Vektor mit den drei Farbwerten
    R,
    G,
    B: byte;
  end;
var
  pData: ^TRGBColor; //Zeiger auf einen Vektor mit Farbwerten
  bmp: TBitmap;
begin
    bmp := TBitmap.Create;
    bmp.assign(image1.Picture.Bitmap);
    for y:= 0 to bmp.Height - 1 do begin
      pData := bmp.ScanLine[y]; //zuweisen der Adresse des ersten Bildpunktes der y-ten Zeile 
      for x:= 0 to bmp.Width -1 do begin
         RGBtoHSL (pData^, H1, S1, L1); //ich nehm mal an RGBtoHSL verlangt einen Vektor mit RGBFarbwerten,
// deswegen wird pData dereferenziert, ansonsten kanns du auch auf die einzelnen Farben
// zugreifen mit pData^.R, pData^.G und pData^.B
         matrix[0,x,y,1]:= H1 ;
         matrix[0,x,y,2]:= S1 ;
         matrix[0,x,y,3]:= L1 ;
         inc(pData);
      end;
    end;
    bmp.Free;
end;

Hoffe das hilft dir!


Darkpara - So 20.08.06 22:32

danke euch hab's glaub verstanden werde es morgen gelich ausprobieren :)

@Marco diese funktion hab ich selbst geschrieben hätte ich dazu geben müssen wies aussieht sorry