如何通过ScanLine复制灰度位图



我想将像素从BMP1复制到BMP2,但复制的图像杂乱无章。为什么?

注:输入图像为pf8bit;

TYPE
TPixArray = array[0..4095] of Byte;
PPixArray = ^TPixArray;
procedure Tfrm1.CopyImage;
VAR
BMP1, BMP2: TBitmap;
y, x: Integer;
LineI, LineO: PPixArray;
begin
BMP1:= TBitmap.Create;
BMP2:= TBitmap.Create;
TRY
BMP1.LoadFromFile('test.bmp');
BMP2.SetSize(BMP1.Width, BMP1.Height);   
BMP2.PixelFormat:= BMP1.PixelFormat;
for y:= 0 to BMP1.Height -1 DO
begin
LineI := BMP1.ScanLine[y];
LineO := BMP2.ScanLine[y];
for x := 0 to BMP1.Width -1 DO
LineO[x]:= LineI[x];
end;
//BMP2.SaveToFile('out.bmp');
imgOut.Picture.Assign(BMP2); //TImage
FINALLY
FreeAndNil(BMP2);
FreeAndNil(BMP1);
END;
end;

对于保存的图像,图形编辑器说";像素深度/颜色:索引,256调色板";。

值得指出的是,8位位图不一定是灰度级的。

相反,它是一个位图;"颜色表";由多达256个条目组成,并且每个像素指的是该表中的一个条目。因此,如果一个像素的值是185,这意味着它应该使用位图"中位置185处的颜色;颜色表";。因此,与16、24或32位位图相比,8位位图的工作原理完全不同,16、24和32位位图没有颜色表,而是在每个像素处具有实际的RGB(a(值。

在您的情况下,问题可能是目标像素图与源位图没有相同的颜色表。

事实上,我以前从未使用过8位位图和调色板,但我认为它很简单:

var
s, t: TBitmap;
y: Integer;
sp, tp: PByte;
x: Integer;
begin
s := TBitmap.Create;
try
s.LoadFromFile('C:UsersAndreas RejbrandDesktopbitmap.bmp');
Assert(s.PixelFormat = pf8bit);
t := TBitmap.Create;
try
t.PixelFormat := pf8bit;
t.SetSize(s.Width, s.Height);
t.Palette := s.Palette;        // <-- Let the new image have the same colour table
for y := 0 to s.Height - 1 do
begin
sp := s.ScanLine[y];
tp := t.ScanLine[y];
for x := 0 to s.Width - 1 do
tp[x] := sp[x];
end;
t.SaveToFile('C:UsersAndreas RejbrandDesktopbitmap2.bmp');
finally
t.Free;
end;
finally
s.Free;
end;

相关内容

  • 没有找到相关文章

最新更新