怎么样把一副BMP图象的背景色清除。 (100分)

S

sunys

Unregistered / Unconfirmed
GUEST, unregistred user!
怎么样把一副BMP图象的背景色清除。要讲究速度的。
 
首先,点数最多的颜色背景色不一定是背景色
第二,如果真要点数最多的颜色的话,遍历各点跑不了,最多可以向打台球一样,如果对手打光台上的球分也没你高,那就算你赢了
第三,转为白色要遍历各点,背景色统计方法上有速度优化的空间,不过影响几乎可以忽略
下面这个方法,不严密但实用,如果你可以定制BMP,制作时要求一下即可(不过我想如果你可以也不会问这个问题)
先取背景色Canvas.Pixels[0, Height - 1],大多数情况下是对的,然后遍历,替换
 
这个是转换成灰度的函数,如果你需要把背景转换成白色,那么你就需要知道什么色是背景色,
然后让他的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;
 
怎么都碰到了你了,呵呵。
 
yanghai0437,这个代码该如何写呢?
如果下面这样写,好象速度很慢。
Canvas.Pixels[X,Y]:=Canvas.Pixels[0, Height - 1];
 
内存绘图
首先建立内存canvas和bitmap关联
然后你就可以使用canvas的矢量绘图函数
以及bitblt对bitmap操作了
 
做二次循环,遇到背景色就替换成白色,我觉得也没有什么更快的方法了.
 
lijun4183,能否写出具体代码来呢?

 
procedure TransFormColor(Bmp: TBitmap; OldColor, NewColor: TColor);
var
i, j: Integer;
P: PByteArray;
Color: TColor;
R, G, B: Byte;
begin
R := GetRValue(NewColor);
G := GetGValue(NewColor);
B := GetBValue(NewColor);
Bmp.PixelFormat := pf24bit;
for j := 0 to Bmp.Height - 1 do
begin
P := Bmp.ScanLine[j];
for i := 0 to Bmp.Width - 1 do
begin
Color := RGB(P[i * 3 + 2], P[i * 3 + 1], P[i * 3]);
if Color = OldColor then
begin
P[i * 3 + 2] := R;
P[i * 3 + 1] := G;
P[i * 3] := B;
end;
end;
end;
end;

Sample:
//将 Bmp 中的黑色替换为白色
TransFormColor(Bmp, clBlack, clWhite);
 
我的背景色还不止单单一种颜色,哎,还是不行。

怎么样把背景色去掉?
 
先保存系统调色板,再更改调色板中你要设置为背景颜色的颜色,再画位图到佻的画布上,然后恢复系统调色板,即可。多快呀!别忘了给我加分噢!
 
redleaf_wgm:
具体代码怎么写呢??
 
如果背景只有一个颜色。
可以用一个 MASK 的图片。MASK 图片与原图一样
只不过只有两种颜色,黑色表示可见的区域,白色表示透明的。
作画里先用 Bitblt + SRCAND 参数画上 MASK
再用 bitblt + SRCPAINT 画同 原图
这样就可以透明背景了。

不过背景不只一个颜色就不清楚了。
 
关键我认为什么是背景色,如果背景色是一个简单的颜色,很是简单,可以遍历替换,但是如果比较复杂,例如多层,我觉得就应该转化为灰度图,然后按照光照区分.
 
xyf2001721:是比较复杂的,你能写出代码吗?
 
晕,草丛中的一只青蛙,要把草去掉,只留下青蛙?!
还是手工作图最快了。
 
看来是没有什么好方法了。
 
我也想知道
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
1K
import
I
I
回复
0
查看
721
import
I
顶部