Wie Grauwertpixelbild darstellen

Ich will in DELPHI aus CT-DICOM-Files (medizinische CT-Bilder als Byte-Files) Bilder in einem DELPHI-Form zeichnen. Wie kann ich Pixel-Punkte in einer Matrix setzen und diesen noch Grauwerte zuordnen(mir stehen Grauwert-Zahlen als Integer (0…255) zur Verfügung).
Kann mir jemand einen Rat geben?

Vielen Dank

Eyck

Hallo erstmal,

hier ein kurzes Programm was die helfen könnte:

function CTtoColor(CT:byte):TColor;
var col:longint;
begin
col:=ct*3; {Wandelt den 1 Byte Grauwert in ein 3 Byte Farbwert, der hier aber Grau ist}
CTToColor:=TColor(col); {Deklariert die Bytes als Farbe}
end;

Hiermit kannst du auf der Form einzelne Pixels malen:

procedure …;
begin
form1.canvas.pixels[x,y]:= {irgend eine Farbe}
{x und y sind die Postion des Pixels}
end;

Aber das ist nicht gerade sehr schön, weil jedes Pixel nacheinander gezeichnet wird. Daher empfehle ich dir folgendes:

var CTBild: TBitmap;
procedure TForm1.create(Sender :TObject);
begin
CTBild:=TBitmap.create;
CTBild.height:=300;
CTBild.width:=300;
{vielleicht mußt du eine andere grösse festlegen}
end;

procedure TForm1.paint(Sender :TObject);
begin
canvas.draw(CTBild,0,0);
{oder
canvas.strechdraw(CTBild,0,0,Rect(0,0,300,300));}
{verändert die grösse des Bitmaps}
end;

procedure CTladen;
var col:byte;
begin
{lädst das Byte und setzt es gleich col}
CTbild.canvas.pixels[x,y]:=col;
{x und y sind die Postion des Pixels}
invalidate; {Nachdem das Bild komplett geladen wurde]
end;

Ich hoffe, ich hab dir damit geholfen.

Gruß Thomas

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Ups, da hatte ich doch einen Fehler in der CTtoColor Funktion, aber hier die Verbesserung:

function CTtoColor(ct:byte):TColor;
var col:longint;
col_bytes:array[0…3]of byte absolute col;
begin
col_byte[0]:=ct; {Das hier wandelt den 1 Byte Grauwert in ein}
col_byte[1]:=ct; {in ein 4 Byte Farbwert}
col_byte[2]:=ct;
col_byte[3]:=0;
CTtoColor:=TColor(col);
end;

Hi Thomas,

die Umwandlung „1-Byte-Grau-zu-3-Byte-Grau“ kann auch in nur einer Zeile bewerkstelligt werden. Möglicherweise ist aber diese Lösung trotz ihrer Kompaktheit langsamer als Deine, weil darin eine Multiplikation ausgeführt wird (Deine Lösung bemüht ja noch nicht mal Addition oder Subtraktion – das ist natürlich unschlagbar :smile:):

function CTtoColor (ct: byte): TColor;
begin
 Result := TColor(ct\*$010101)
end;

Mit freundlichem Gruß
Martin

Oh danke. Lob tut immer gut. :smile:
Aber die Einfachheit verblüfft hier wirklich. Sie ist beinahe so gross wie die als ich rausfand, wie man eine Fabre invertiert ($00FFFFFF-Ausgangsfarbe). Aber du hast recht, meins ist wirklich schneller.

Gruß Thomas

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]