将具有任何像素格式的位图转换为特定像素格式

Convert Bitmap with any pixel format to specific pixel format

我正在尝试将一堆可能具有任何像素格式(4 位、8 位、16 位、24 位等)的图像转换为 1 位图像。

我有以下代码可以将 24 位转换为 1 位,但这不处理任何其他像素格式。

procedure TFormMain.ButtonConvertClick(Sender: TObject);
var
  Bitmap: TBitmap;
  NewBitmap: TBitmap;
  x,y: Integer;
  ScanLine: pRGBTriple;
  Colour: Integer;
  FilePath: String;
  FileName: String;
begin
  Bitmap := TBitmap.Create;
  try
    Bitmap.LoadFromFile(EditFileName.Text);
    NewBitmap := TBitmap.Create;
    try
      NewBitmap.PixelFormat := pf1bit;
      NewBitmap.Height := Bitmap.Height;
      NewBitmap.Width := Bitmap.Width;
      for y := 0 to Bitmap.Height -1 do
        begin
          ScanLine := Bitmap.ScanLine[y];
          for x := 0 to Bitmap.Width -1 do
            begin
              Colour := (ScanLine.rgbtBlue + ScanLine.rgbtGreen + ScanLine.rgbtRed) div 3;
              if (Colour >= 128)
                then Colour := clWhite
                else Colour := clBlack;
              NewBitmap.Canvas.Pixels[x, y] := Colour;
              Inc(ScanLine);
            end;
        end;
      FilePath := ExtractFilePath(EditFileName.Text);
      FileName := TPath.GetFileNameWithoutExtension(EditFileName.Text);
      NewBitmap.SaveToFile(TPath.Combine(FilePath, FileName + '-copy.bmp'));
    finally
      FreeAndNil(NewBitmap);
    end;
  finally
    FreeAndNil(Bitmap);
  end;
end;

我可以单独处理每个案例,但似乎应该有一个函数可以做到这一点。我查看了 TGPBitmap.Clone 函数 class,但我只能让它生成空白(白色)图像,并且找不到任何使用示例。

最简单的方法 - 在 24 位位图上绘制任何位图并使用现有代码。

最慢的方式——通过Pixels[]获取每个像素的颜色[] 属性

否则你必须单独对待每一种位图。请注意,1,4 和 8 位位图包含调色板索引,因此您需要从位图调色板中获取正确的颜色,而 15 位和 16 位位图像素具有结构 xRRRRRGGGGGBBBBB 和 RRRRRGGGGGGBBBBB,因此您需要提取 5 位和 6 位颜色部分并计算整体像素亮度。