Код:
function RGBA(r, g, b, a: Byte): COLORREF;
begin
Result := (r or (g shl 8) or (b shl 16) or (a shl 24));
end;
function rgb565toImage1(data: string; bytesperpixel, width, height, redOffset, redSize, blueOffset, blueSize, greenOffset, greenSize, alfaOffset, alfaSize: integer): TBitMap;
var
Bmp: TBitMap;
i, j, k: cardinal;
temp, alfa, red, green, blue: cardinal;
a: Char;
begin
Bmp := TBitMap.Create;
Bmp.height := height;
Bmp.width := width;
Bmp.PixelFormat := pf32bit;
for i := 0 to Bmp.height - 1 do
begin
for j := 0 to Bmp.width - 1 do
begin
temp := 0;
for k := 0 to bytesperpixel do
begin
temp := temp shl 8;
a := data[i * width * bytesperpixel + j * bytesperpixel + 3 + k];
temp := temp or orD(a);
end;
red := (temp and (($FF shr (8 - redSize)) shl redOffset)) shr redOffset;
green := (temp and (($FF shr (8 - greenSize)) shl greenOffset)) shr greenOffset;
blue := (temp and (($FF shr (8 - blueSize)) shl blueOffset)) shr blueOffset;
alfa := (temp and (($FF shr (8 - alfaSize)) shl alfaOffset)) shr alfaOffset;
red := (red shl (8 - redSize)) or (red shr (redSize - (8 - redSize)));
green := (green shl (8 - greenSize)) or (green shr (greenSize - (8 - greenSize)));
blue := (blue shl (8 - blueSize)) or (blue shr (blueSize - (8 - blueSize)));
alfa := (alfa shl (8 - alfaSize)) or (alfa shr (alfaSize - (8 - alfaSize)));
Bmp.Canvas.Pixels[j, i] := RGBA(red, green, blue, alfa);
end;
end;
Result := Bmp;
end;
или
Код:
//Code by GunSmoker
function rgb565toImage2(data: string; bytesperpixel, width, height, redOffset, redSize, blueOffset, blueSize, greenOffset, greenSize, alfaOffset, alfaSize: integer): TBitMap;
CONST
PixelCountMax = 32768;
TYPE
pRGBQuadArray = ^TRGBQuadArray;
TRGBQuadArray = ARRAY [0 .. PixelCountMax - 1] OF TRGBQuad;
var
Bmp: TBitMap;
i, j: cardinal;
temp, alfa, red, green, blue: cardinal;
r: pRGBQuadArray;
begin
Bmp := TBitMap.Create;
Bmp.SetSize(width, height);
Bmp.HandleType := bmDIB;
Bmp.PixelFormat := pf32bit;
for i := 0 to Bmp.height - 1 do
begin
r := Bmp.ScanLine[i];
for j := 0 to Bmp.width - 1 do
begin
case bytesperpixel of
1:
temp := PByte(@data[i * width * bytesperpixel + j * bytesperpixel + 1])^;
2:
temp := PWord(@data[i * width * bytesperpixel + j * bytesperpixel + 1])^;
4:
temp := PCardinal(@data[i * width * bytesperpixel + j * bytesperpixel + 1])^;
else
Assert(False);
end;
red := (temp and (($FF shr (8 - redSize)) shl redOffset)) shr redOffset;
green := (temp and (($fF shr (8 - greenSize)) shl greenOffset)) shr greenOffset;
blue := (temp and (($ff shr (8 - blueSize)) shl blueOffset)) shr blueOffset;
alfa := (temp and (($ff shr (8 - alfaSize)) shl alfaOffset)) shr alfaOffset;
red := (red shl (8 - redSize)) or (red shr (redSize - (8 - redSize)));
green := (green shl (8 - greenSize)) or (green shr (greenSize - (8 - greenSize)));
blue := (blue shl (8 - blueSize)) or (blue shr (blueSize - (8 - blueSize)));
alfa := (alfa shl (8 - alfaSize)) or (alfa shr (alfaSize - (8 - alfaSize)));
Bmp.Canvas.Pixels[j, i] := RGBA(red, green, blue, alfa);
end;
end;
Result := Bmp;
end;
Код:
var
FileStream: TFileStream;
StrStream: TStringStream;
...
FileStream := TFileStream.Create(OpenDialog1.FileName, fmShareExclusive);
FileStream.Position := 0;
StrStream.LoadFromStream(FileStream);
Image1.Picture.Graphic := nil;
Image1.Picture.Bitmap := rgb565toImage1(StrStream.DataString, bytesperpixel, width, height, redOffset, redSize, blueOffset, blueSize,
greenOffset, greenSize, alfaOffset, alfaSize);
Код:
bytesperpixel := 4;
width := 800;
height := 480;
redOffset := 0;
redSize := 8;
blueOffset := 16;
blueSize := 8;
greenOffset := 8;
greenSize := 8;
alfaOffset := 24;
alfaSize := 8;
Не могу понять почему не получется получить нормальное изображение. В каком месте я допустил ошибку?
Оригинальное изображение и RAW изображение можете посмотреть в аттаче