我正在尝试将一堆图像转换为可能具有任何像素格式(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函数类,但我只能得到它来生成空白(白色)图像,但无法找到它的任何使用示例。
答案 0 :(得分:1)
最简单的方法 - 在24位上绘制任何位图并使用现有代码。
最慢的方式 - 通过Pixels []属性获取每个像素的颜色
否则你必须单独处理每种位图。请注意,1,4和8位位图包含调色板的索引,因此您需要从位图调色板获取正确的颜色,15和16位位图像素具有结构xRRRRRGGGGGBBBBB和RRRRRGGGGGGBBBBB,因此您需要提取5位和6位颜色部分并计算整体像素亮度。