【问题标题】:How to copy a gray-scale bitmap via ScanLine如何通过 ScanLine 复制灰度位图
【发布时间】:2020-12-02 07:56:43
【问题描述】:

我想将像素从 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 调色板”。

【问题讨论】:

  • 您的实际问题是什么?为什么坚持复制扫描线而不使用BMP2.Assign()
  • @AmigoJack - 简单:因为我需要对像素进行一些处理 :) 所以分配不起作用:)
  • 下次将隐藏的细节添加到您的问题中,这样没有人会不必要地回答本可以立即避免的问题。另请注意,这样也不会复制源位图中的潜在 ICC 配置文件。
  • @AmigoJack - 如果我在我的代码和标题中明确提到了 ScanLine,这意味着我需要它。但无论如何,这种讨论毫无意义。 Andreas 已经提供了解决方案!

标签: delphi bitmap tbitmap


【解决方案1】:

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

Instead,它是一个位图,带有一个“颜色表”,最多由 256 个条目组成,每个像素指的是这个表中的一个条目。因此,如果一个像素的值为 185,这意味着它应该使用位图“颜色表”中位置 185 的颜色。因此,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:\Users\Andreas Rejbrand\Desktop\bitmap.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:\Users\Andreas Rejbrand\Desktop\bitmap2.bmp');

    finally
      t.Free;
    end;

  finally
    s.Free;
  end;

【讨论】:

    猜你喜欢
    • 2014-07-28
    • 1970-01-01
    • 2014-11-03
    • 2021-02-24
    • 2011-10-10
    • 1970-01-01
    • 2014-09-24
    • 1970-01-01
    • 2023-04-02
    相关资源
    最近更新 更多