怎么样把一副BMP图象的背景色转为白色。 注意速度。

解决方案 »

  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;
      

  2.   

    顶!
    顺便借贵地问一下,怎么让LABEL的背景是透明的?
      

  3.   

    估计要用到边缘提取算法,如果背景和图象差异比较明显的话可以用Roberts算法否则的话最好用高斯拉普拉斯算法,建议楼主看一下数字图象处理的书,有 一 本《Visual C++数字图 象处理》有这两个算法的C++源代码
      

  4.   

    //简单方法,扫描替换全部的点~~
    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 }
      

  5.   

    procedure TForm1.Button2Click(Sender: TObject);
    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;
      

  6.   

    透明的位图你往哪里画,那就是你的事了。
    我想你应该画在另一张白白的 TBitmap 上吧。
      

  7.   

    我这个背景色是混合的颜色,有好几种的。cnmaxu(max)的方法就可能不行了。
      

  8.   

    那你有没有一个单独的背景图片作为参考?
    要不然,计算机怎么知道哪些是背景图片,哪些是前景图片。
    bmp文件又不是分层的。
    如果你有单独背景图片可以作为参考的话,可以用相异的方法,把背景去掉
    不过这还是会遇到前景和背景有像素重复的情况,没有办法处理。
      

  9.   

    Bitmap.TransparentColor:=你的背景色;可以让你的背景透明
    扫描整副图 把你的背景色都变成RGB(255,255,255)可以让你的背景变白 
    这两个方法的速度好像是后者快一点
      

  10.   

    就算真的是,那你只能用遍历图像的方法把图中所有属于你定义的背景色的颜色都替换成白色了。用 ScanLine 吧。