Entwickler-Ecke

Multimedia / Grafik - ich raff den befehl einfach nicht : "scanline"


Delphianer23 - Fr 21.02.03 20:21
Titel: ich raff den befehl einfach nicht : "scanline"
Hab schon gesucht, aber die Themen haben mir nicht
weitergeholfen.
Es soll

Ich berechne jeden Pixel einzel.
Wie soll ich ihn dann ausgeben mit scanline?


So (sehr sehr) vereinfacht sieht mein code mit pixel[] aus


y:=-1;
repeat
inc(y);

x:=-1;
repeat
inc(x);

//Rechnung für Farbe //rechnefarbe(x,y)

Bitmap1.canvas.pixel[x,y]:=RGB(//Berechnete Werte//)

until x = 200;

until y = 200;



Wie mach ich den code mit scanline?


Aya - Fr 21.02.03 20:35

Hi,

das is dahier hab ich zum testen benutzt was schneller ist... (siehe anderes Topic im Freeware Bereich):


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure TForm1.BitBtn1Click(Sender: TObject);
var
  x, y: Integer;
  bit: TBitmap;
  P: PByteArray;
begin
  Bit:=TBitmap.Create;
  Bit.PixelFormat:=pf24Bit;
  Bit.Width:=Image.Width;
  Bit.Height:=Image.Height;
  for y:=0 to Bit.Height-1 do begin
    P:=Bit.ScanLine[y];
    for x:=0 to Bit.Width-1 do begin
      P^[x*3]:=255; // Blau
      P^[x*3+1]:=0;    // Rot
      P^[x*3+2]:=0;    // Grün
    end;
  end;
  Image.Canvas.Draw(0,0,Bit);
  Bit.Free;
end;


in P wird die Scanline für jede Horrizontale Linie des Bitmaps gespeichert, in der 2ten For-Schleife wird dann jedem einzelnen Wert in diesem Array ein wert zugewiesen.
x*3 daher, weil es ja 3 Werte sind, R, G und B... :)

Hoffe das hat dir geholfen.

Au'revoir,
Aya


Delphianer23 - Fr 21.02.03 21:15

Danke habs verstanden, nur sieht das Bild von den Farben her
ganz anders aus.


Ich hab auch drauf geachtet dass wirklich rot bei rot ist usw.

Aber es sieht trotzdem ganz anders aus.

Was könnte es noch sein?
Sie die irgendwie noch anders defieniert?


Aya - Fr 21.02.03 21:28

Mhh.. ne, so wie in meinem beispiel stimmt es schon.. du hast wahrscheinlich irgendwie die farben verdreht.. *g*

Denk dran, $00FF0000 in Delphi ist nicht Rot, sondern Blau!


OregonGhost - Sa 22.02.03 12:54

Aya hat folgendes geschrieben:

P^[x*3]:=255; // Blau
P^[x*3+1]:=0; // Rot
P^[x*3+2]:=0; // Grün

Bist du sicher? Wenn ich mich recht erinnere, ist die Reihenfolge in Win32-DIBs BGR und nicht BRG.
Aber das nur mal so als Ergänzung.


Aya - Sa 22.02.03 16:37

arg ups... klar.. BGR... sorry :oops:
War ich wohl mit gedanken ein wenig durcheinander als ich das geschrieben habe..


maximus - Sa 22.02.03 17:58

Hi, ihr scanner.

Was auch noch wichtig wär, ist 'PixelFormat' damit man überhaupt auf das aktuelle Farb-format reagieren kann. Bei 32 bit liegen die daten in BGRX order und bei 24 bit in BGR, wie ihr schon sagtet :)

bis denn. mx