Zitat von
thepaine91:
Das ganze nochmal kommentiert.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
// Dieses Beispiel zeigt das direkte Zeichnen in das Bitmap
var
x,y : Integer;
BitMap : TBitMap;
P : PByteArray;
begin
BitMap := TBitMap.create;
try
BitMap.LoadFromFile('C:\Programme\Gemeinsame Dateien\Borland Shared\Images\Splash\256color\factory.bmp');
for y := 0 to BitMap.Height -1 do
begin
P := BitMap.ScanLine[y]; // Füllt einen Array of Byte mit den Daten der angegebenen Zeile.
for x := 0 to BitMap.Width -1 do
// P = length Bitmap.width -1
// Wenn man jetzt row 1 ausliest und P unser Bytearray ist und dem zu folge P[1] ausliest hätte man das selbe wie Pixels[1,1]
P[x] := y;
end;
Canvas.Draw(0,0,BitMap);
finally
BitMap.Free;
end;
end;
Jetzt soweit verständlich
Das ganze nochmal verbessert
Du weißt schon, dass das so nicht korrekt ist?
Es gibt soetwas, dass nennt sich Pixelformat. Falls es beispielsweise auf pf24Bit gesetzt ist,
besteht das Bild (bzw dann die einzelnen Rows) aus aneinander gereihten 24/8 Bytes -> r, g, b; wobei die Reihenfolge nicht die gleiche sein muss...
Sieh dir das hier mal an:
Delphi-Quellcode:
var
Pixel : PByte;
y, k, x : Integer;
bytes : Byte;
const
PixelFormatBytes: Array[TPixelFormat] of Byte = ( 0, 0, 0, 1, 0, 2, 3, 4, 0 );
begin
bytes := PixelFormatBytes[bmp.PixelFormat];
if bytes = 0 then
Exit; // PixelFormat wird nicht unterstützt ... kannst du dann gerne von mir aus umändern ...
for y := 0 to bmp.Height - 1 do
begin
Pixel := bmp.Scanline[y];
for x := 0 to bmp.Width - 1 do
for k := 0 to bytes - 1 do
begin
Pixel^ := 0;
inc( Pixel );
end;
end;
end;