我想做一个游戏的辅助工具,简单描述下抓取不可行走区域的功能:
先load一张大地图,然后在地图上面直接画矩形图,记录下矩形的左上跟右下脚坐标。稍做转换可得到一块关于不可行走区域的范围的数据
问题:如何在BMP档上画一个半透明的矩形,并且这个矩形可以移动,可以改变大小?
请高手指点,谢谢

解决方案 »

  1.   

    请问“原图与目标图分别乘以透明系数和透明系数的反。”是什么意思?取出每点的RGB然后去做运算?我的意思就是在一副大图片上面用半透明的色块“贴”在上面,以表示该地方是特殊区域,但是可以我一次画上去的这个色块可能不是很规范,那我可以移动它或者调整它,而半透明的目的,是画上这个矩形后,还隐约能看到后面的背景图,有利于调整。
    这样说不知道楼上的明白吗?
      

  2.   

    将任何一点P(R,G,B)的分量(R,G,B)分别加上(255,255,255),再除以2,也就是将P(R,G,B)改为     P'((R+255)/2,(G+255)/2,(B+255)/2)这一点就半透明了.
      

  3.   

    我是用Rectangle(X1,y1,x2,y2 : Integer);的方法在Image的画布上绘制矩形,按楼上的方法,会不会画出来的只是一个颜色淡了一点的不透明矩形,除了 Rectangle 有没有别更好更方便的方法,我的目的只想标识出这个块,记录这个块的坐标信息,并且可以方便的调整即可
      

  4.   

    如果是WIN2K以上运行可以使用透明层SetLayeredWindowAttributes方式来建立,然后抓图OK了
      

  5.   

    如果大图与贴的图,你都可以控制的话,为了控制简单,你贴的图可以用image控件。当imagae放在某个位置的时候,从大图上控出对应的图形然后与你要贴的图进行半透明运算,这样看上去应该就是你要的效果,而且因为拖动image控件,所以控制也方便。
    还有一个比较复杂的方法,就是你要直接在大图上绘制,但是基本的理论还是和上面一样,不过你必须将大图上覆盖的部分保存起来,以全球还原。而且要实现拖动的话,还要对鼠标控制。
    如果你只想做50%的半透明的话。半透明的算法就比较的简单。R = (R1+R2) shr 1,G、B也如此(R为结果。R1和R2分别为目标与源),当然就是要一个点一个点的运算。位图的话,用scanline比较快一些。如果不想麻烦的话,找一些现成的函数也是不错的选择,如GDI+
      

  6.   


    function IntToByte(i: Integer): Byte;
    begin
      if i > 255 then
        Result := 255
      else if i < 0 then
        Result := 0
      else
        Result := i;
    end;procedure BmpAlphaBlend(var dBmp: TBitMap; sBmp: TBitmap; Pos: TPoint; Alpha: integer; TranColor: TColor = -1);
    type
      tagRGBTRIPLE = packed record
        rgbtBlue: Byte;
        rgbtGreen: Byte;
        rgbtRed: Byte;
      end;
      TRGBTriple = tagRGBTRIPLE;
      PRGBTripleArray = ^TRGBTripleArray;
      TRGBTripleArray = array[0..32767] of TRGBTriple;
      function GetSLColor(pRGB: TRGBTriple): TColor;
      begin
        Result := RGB(pRGB.rgbtRed, pRGB.rgbtGreen, pRGB.rgbtBlue);
      end;
    var
      p0, p1: PRGBTripleArray;
      r, g, b, p, x, y: Integer;
    begin
      sBmp.PixelFormat := pf24bit;
      dBmp.PixelFormat := pf24bit;
      if TranColor = -1 then
        TranColor := sBmp.Canvas.Pixels[0, 0];
      for y := 0 to sBmp.Height - 1 do
        if (y + Pos.y >= 0) and (y + Pos.Y < dBmp.Height) then
        begin
          p0 := dBmp.ScanLine[y + Pos.y];
          p1 := sBmp.ScanLine[y];
          for x := 0 to sBmp.Width - 1 do
            if (x + pos.X >= 0) and (x + Pos.X < dBmp.Width) then
              if GetSLCOlor(p1[x]) <> TranColor then
              begin
                p0[x + pos.X].rgbtRed := IntToByte((p0[x + pos.X].rgbtRed * (100 - Alpha) +
                  p1[x].rgbtRed * Alpha) div 100);            p0[x + pos.X].rgbtGreen := IntToByte((p0[x + pos.X].rgbtGreen * (100 - Alpha) +
                  p1[x].rgbtGreen * Alpha) div 100);            p0[x + pos.X].rgbtBlue := IntToByte((p0[x + pos.X].rgbtBlue * (100 - Alpha) +
                  p1[x].rgbtBlue * Alpha) div 100);
              end;
        end;end;procedure TForm1.Button1Click(Sender: TObject);
    var
      brBmp, srcBmp: TBitmap;
    begin
    //
      brBmp := TBitmap.Create;
      brBmp.LoadFromFile('c:\a.bmp');
      brBmp.PixelFormat := pf24bit;  srcBmp := TBitmap.Create;
      srcBmp.LoadFromFile('c:\bmp');
      srcBmp.PixelFormat := pf24bit;  BmpAlphaBlend(
        brBmp, //背景图(大图,也是结果图)
        srcBmp, //需要合成的小图
        Point(60, 60), //画小图的坐标
        100, //半透明度
        -1//需要透明的颜色(用于不规则图形,-1就表示以0,0位置的颜色为透明色)
        );  canvas.Draw(0, 0, brBmp);
      brBmp.Free;
      srcBmp.Free;
    end;把偶精心研究的都拿出来了,楼主应该把分全给我吧:)
      

  7.   

    1982fish(fish) :
    半透明,就是“淡”一点,如果一点不淡,那就是全透明了。
      

  8.   

    你也可以改用其他的值,例如128,不用255, 来和原来的R,G,B作平均。
    你可以试试各种不同的值来与原来的R,G,B作平均,看用哪一个值最满意。
      

  9.   

    你还可以改用一种更简便的办法来实现半透明效果:在image1组件之上,叠加一个大小和Image1一样的Image2,然后将Image2填充成灰白色,同时设置其属性为transparent. 
      

  10.   

    好象要用alpha通道的圖象處理,borland的設計網頁有代碼下載,可惜忘記是什麼了
      

  11.   

    一般地,用一种固定的颜色C0(R0,G0,B0),去与图像中任意点(R,G,B)混合,
    使此点的颜色变成:  (R0+R)/2,(G0+G)/2,(B0+B)/2都能使图像变成半透明。
      

  12.   

    KAO,你们能不能试一下我的代码后再说,不停的说道理有什么用?!!
      

  13.   

    xzhifei:
    因为看一大片代码不如了解原理方便。
      

  14.   

    如果图像采用的是索引模式,还可简单地通过对RGBA调色板中
    A分量(alpha分量)的设置来实现透明。alpha=0为全透明,alpha=1为全不透明,alpha=0.5为半透明