将具有任何像素格式的位图转换为特定像素格式
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 位颜色部分并计算整体像素亮度。
我正在尝试将一堆可能具有任何像素格式(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 位颜色部分并计算整体像素亮度。