我需要转换画布的所有像素
我在google快速搜索后发现了这个功能
但不工作正确,但它似乎必须工作好!!
function RGBBitmapTo1Bit(OriginalBitmap : TBitmap) : TBitmap;
var
x, y : integer;
begin
result := TBitmap.Create;
result.width := OriginalBitmap.width;
result.height := OriginalBitmap.height;
for x := 1 to OriginalBitmap.width do
for y := 1 to OriginalBitmap.height do
begin
result.Canvas.Pixels[x, y] := clBlack;
end;
end;
这个函数不对文件做任何改变
比如我用的是这样的
procedure TForm1.Button2Click(Sender: TObject);
var
imgf : TBitmap;
begin
if od1.Execute then
begin
imgf := TBitmap.Create;
imgf.LoadFromFile(od1.FileName);
RGBBitmapTo1Bit(imgf);
imgf.SaveToFile(ExtractFilePath(od1.FileName)+'test.bmp');
end;
但是输出和输入文件是相同的!!!
我怎样才能正确地将颜色分配给像素!?
1条答案
按热度按时间bkhjykvo1#
你的代码有三个问题:
1.像素在两个维度上都是0索引的,因此您需要相应地更改循环。
1.你的函数不修改原始的
TBitmap
,它分配和修改一个新的TBitmap
,然后返回给调用者,但调用者忽略了新的位图,期望原始的TBitmap
已经被修改。您正在将原始TBitmap
保存到文件中,这就是为什么您看不到任何像素更改的原因。1.您正在泄漏两个
TBitmap
对象的内存;试试这个:
或者这个:
话虽如此,
RGBBitmapTo1Bit()
在两个版本中都很慢。更快的版本应该是这样的:或者:
它也不做它的名字所暗示的-将位图转换为1位。为此,您必须设置
TBitmap.PixelFormat
属性:或者: