//简单方法,扫描替换全部的点~~ function ColorReplaceA(mBitmap: TBitmap; mOldColor, mNewColor: TColor): Boolean; var I, J: Integer; begin Result := False; if not Assigned(mBitmap) then Exit; for I := 0 to mBitmap.Width - 1 do for J := 0 to mBitmap.Height - 1 do if mBitmap.Canvas.Pixels[I, J] = mOldColor then mBitmap.Canvas.Pixels[I, J] := mNewColor; Result := True; end; { ColorReplaceA }//看成透明色绘制~~ function ColorReplaceB(mBitmap: TBitmap; mOldColor, mNewColor: TColor): Boolean; var vBitmap: TBitmap; begin Result := False; if not Assigned(mBitmap) then Exit; if ColorToRGB(mOldColor) = ColorToRGB(mNewColor) then Exit; vBitmap := TBitmap.Create; try vBitmap.Assign(mBitmap); vBitmap.TransparentColor := mOldColor; vBitmap.Transparent := True; mBitmap.Canvas.Brush.Color := mNewColor; mBitmap.Canvas.FillRect(mBitmap.Canvas.ClipRect); mBitmap.Canvas.Draw(0, 0, vBitmap); finally vBitmap.Free; end; Result := True; end; { ColorReplaceB }
然后让他的rgb值都等与255就可以了.
//功能:把采集的彩色图象转换成灰度图象//灰度化(加权)//参数:BitmapSouce,指向采集进来的图象数据(参见图象采集卡手册)//返回:转换后的灰度图象数据
function TCGCard.ClrToGray(const BitmapSouce:TBitmap):TBitmap;
var
p: PByteArray;
x, y: Integer;
Bmp: TBitmap;
Gray: byte;
begin
Bmp := TBitmap.Create;
Bmp.Assign(BitmapSouce);
Bmp.PixelFormat := pf24Bit;
for y := 0 to Bmp.Height - 1 do
begin
p := Bmp.scanline[y];
for x := 0 to Bmp.Width - 1 do
begin
Gray := (p[x * 3+2] * 299 + p[x * 3 + 1] * 587 + p[x * 3 ] * 114) div 1000;
p[x * 3 + 2] := gray ;
p[x * 3 + 1] := gray;
p[x * 3] := gray;
end;
end;
Result:= Bmp;
end;
顺便借贵地问一下,怎么让LABEL的背景是透明的?
function ColorReplaceA(mBitmap: TBitmap; mOldColor, mNewColor: TColor): Boolean;
var
I, J: Integer;
begin
Result := False;
if not Assigned(mBitmap) then Exit;
for I := 0 to mBitmap.Width - 1 do
for J := 0 to mBitmap.Height - 1 do
if mBitmap.Canvas.Pixels[I, J] = mOldColor then
mBitmap.Canvas.Pixels[I, J] := mNewColor;
Result := True;
end; { ColorReplaceA }//看成透明色绘制~~
function ColorReplaceB(mBitmap: TBitmap; mOldColor, mNewColor: TColor): Boolean;
var
vBitmap: TBitmap;
begin
Result := False;
if not Assigned(mBitmap) then Exit;
if ColorToRGB(mOldColor) = ColorToRGB(mNewColor) then Exit;
vBitmap := TBitmap.Create;
try
vBitmap.Assign(mBitmap);
vBitmap.TransparentColor := mOldColor;
vBitmap.Transparent := True;
mBitmap.Canvas.Brush.Color := mNewColor;
mBitmap.Canvas.FillRect(mBitmap.Canvas.ClipRect);
mBitmap.Canvas.Draw(0, 0, vBitmap);
finally
vBitmap.Free;
end;
Result := True;
end; { ColorReplaceB }
var
ABitmap:TBitmap;
begin
ABitmap:=TBitmap.Create;
try
ABitmap.LoadFromFile('你要装入的文件名');
ABitmap.TransparentColor:='你要去掉的背景色例如 clWhite';
ABitmap.Transparent:=True;
Canvas.Draw(0,0,ABitmap);
Canvas.TextOut(0,0,'不透明,脑袋给你');
finally
ABitmap.Free;
ShowMessage('你真笨,I 服了 U!晕…这么简单的问题下回别问,看 VCL Help!');
end;
end;
我想你应该画在另一张白白的 TBitmap 上吧。
要不然,计算机怎么知道哪些是背景图片,哪些是前景图片。
bmp文件又不是分层的。
如果你有单独背景图片可以作为参考的话,可以用相异的方法,把背景去掉
不过这还是会遇到前景和背景有像素重复的情况,没有办法处理。
扫描整副图 把你的背景色都变成RGB(255,255,255)可以让你的背景变白
这两个方法的速度好像是后者快一点