我想将具有 Mono8 格式(单色 8 位)位图的给定缓冲区分配给位图。然后我将生成的位图分配给 TImage 组件以显示它。图片是结果显示的屏幕截图。
以下代码有效,但似乎有点浪费:
procedure CopyToBitmapMono824(_Buffer: PByte; _Bmp: TBitmap);
var
y: Integer;
x: Integer;
ScanLine: PdzRgbTripleArray;
begin
for y := 0 to _Bmp.Height - 1 do begin
ScanLine := _Bmp.ScanLine[y];
for x := 0 to _Bmp.Width - 1 do begin
// monochrome: all 3 colors set to the same value
ScanLine[x].Red := _Buffer^;
ScanLine[x].Green := _Buffer^;
ScanLine[x].Blue := _Buffer^;
Inc(_Buffer);
end;
end;
end;
// [...]
fBmp.PixelFormat := pf24Bit;
FBmp.Monochrome := False;
CopyToBitmap(Buffer, fBmp);
我宁愿使用我尝试过的 pf8Bit 格式的位图:
procedure CopyToBitmapMono8(_Buffer: PByte; _Bmp: TBitmap);
var
y: Integer;
x: Integer;
ScanLine: PByteArray;
begin
for y := 0 to _Bmp.Height - 1 do begin
ScanLine := _Bmp.ScanLine[y];
for x := 0 to _Bmp.Width - 1 do begin
ScanLine[x] := _Buffer^;
Inc(_Buffer);
end;
end;
end;
// [...]
FBmp.PixelFormat := pf8bit;
FBmp.Monochrome := False; // I also tried Monochrome := true
CopyToBitmapMono8(Buffer, FBmp)
如果 MonoChrome 为真,则图片只有预期宽度的 1/4 左右,其余为白色。
如果 MonoChrome 为 false,则图片具有预期的宽度,但左侧 1/4 为单色,其余部分包含虚假颜色。
我显然错过了一些东西,但是什么?
编辑:位图只有预期大小的 1/4 的效果显然是在显示之前将其转换为 JPEG 以保存的副作用(我没有在上面显示的代码,mea culpa)。所以问题只是我没有为位图设置单色调色板。