Falls du es unbedingt mit einem Bitmap machen willst, du aber nicht die restlichen Bytes verschwenden willst, benutze doch Bitmasken. Dann repräsentieren 32 Bits / 4 Bit pro Pixel = 8 Pixel, also sind die Bitmaps entweder nur 1/8 so breit oder du überlegst dir eine andere Aufteilung:
Code: Alles auswählen
var
x,y: Integer; //gesuchter Punkt in deiner Karte
px,py: Integer; //Pixel, in dem der Wert für diesen Punkt gespeichert ist
spIdx: Integer; //Subpixel, welcher deinen 4 Bit entspricht (0-7)
// Man kann wie gesagt 8 Werte pro Pixel speichern
MeinWert: Byte; //Das ist der gespeicherte Wert, hier werden zwangsläufig 4 Bit verschwendet, da Byte der
//kleinste Wert ist. Hier noch zwei Pixel pro Wert zu komprimieren wäre glaube ich eher kontraproduktiv
begin
py:= y; //Dieser Wert ist gleich
px:= x div 8; //Nachkommastellen werden nach Division abgeschnitten
spIdx:= x mod 8; //Rest der Division ist dein gesuchter Subpixel
MeinWert:= Byte(( Bitmap_32Bit.Pixels[ px, py ] shr spIdx * 4{du willst nur 4 bit auslesen}) and $F );
end;
Vielleicht hilft dir folgendes Programm das ganze zu verstehen
Code: Alles auswählen
program Project1;
{$IFDEF WINDOWS}
{$APPYTYPE CONSOLE}
{$ENDIF}
uses
sysutils;
var
TestVal: Int32;
spIdx: Integer;
function IntToBit( int: Int32 ): String; //Quelle: http://www.entwickler-ecke.de/topic_bitdarstellung_103496,0.html
var
i: Integer;
begin
SetLength(result, 32); //Länge festlegen (32 da Integer = 32Bit);
for i := 0 to 31 do begin //alle 32 Bits durchzählen
if (int and 1) = 0 then //wenn das letzte/niederwertigste Bit = 0 ist, dann
result[32-i] := '0' //0 in String schreiben
else //sonst
result[32-i] := '1'; //1 in String schreiben
int := int shr 1; //Int um 1 Bit nach rechts schieben
end;
end;
begin
TestVal:= $00FAFF00;
WriteLn( IntToBit( TestVal ));
spx:= 4;
WriteLn( 'Bitwert von ', spidx, '-', + spIdx + 4, ' ', IntToBit(( TestVal shr ( spIdx * 4 {du willst nur 4 bit} ) AND $F )));
end.
Falls du aber einfach 8 Bit (1 Byte) nehmen willst wäre auch folgendes möglich:
Code: Alles auswählen
type
TPixelValues = packed record
sp[ 0..3 ]: Byte; // Subpixel
end;
var
IntValue: Int32;
SubPixelValue: Byte;
begin
SubPixelValue:= TPixelValues( IntValue ).sp[ 2 ]; // Subpixel 3
end;