首页 > 学院 > 开发设计 > 正文

取得图片的透明区域

2019-11-18 18:24:45
字体:
来源:转载
供稿:网友
(*//标题:取得图片的透明区域说明:适用于制作复杂的不规则窗体设计:Zswang支持:wjhu111@21cn.com日期:2004-03-10//*)
(*//============================================================================设计思路:~~就是对画布一行一行的扫描~~对于不是透明色相连的像素都看成一条条的线段~~  ───────── ─    ───    ─────   ───────           ────    ───────     ───          ─── ──    ───────                ──      ─────────用这些线段组合成不规则的区域~~线段就是找到开始位置和结束位置就行了~~组合区域是最花时间的地方~~减少组合区域的频率就可以提高运行的速度~~用线段组合就比用点组合少多了~~============================================================================//*)
function GraphicToRGN(mGraphic: TGraphic; mTransPoint: TPoint): HRGN;var  I, J: Integer;  vStart: Integer;  vHandle: HRGN;  vTransColor: TColor;begin  Result := 0;  if not Assigned(mGraphic) then Exit;  Result := CreateRectRgn(0, 0, 0, 0);  with TBitmap.Create do try    Width := mGraphic.Width;    Height := mGraphic.Height;    Canvas.Draw(0, 0, mGraphic);    vTransColor := Canvas.Pixels[mTransPoint.X, mTransPoint.Y];    for I := 0 to Height - 1 do begin      vStart := 0;      for J := 0 to Width do begin        if (Canvas.Pixels[J, I] <> vTransColor) and (J < Width)  then          if vStart < 0 then            vStart := J          else        else if vStart >= 0 then begin          vHandle := CreateRectRgn(vStart, I, J, I + 1);          try            CombineRgn(Result, Result, vHandle, RGN_OR);          finally            DeleteObject(vHandle);          end;          vStart := -1;        end;      end;    end;  finally    Free;  end;end; { GraphicToRGN }
//ExamplePRocedure TForm1.Button1Click(Sender: TObject);var  vRGN: HRGN;begin  BorderStyle := bsNone;  Image1.Left := 0;  Image1.Top := 0;  vRGN := GraphicToRGN(Image1.Picture.Graphic, Point(0, 0));  try    SetWindowRgn(Handle, vRGN, True);  finally    DeleteObject(vRGN);  end;end;

上一篇:使用IntraWeb进行Web编程

下一篇:GSM规范中的部分编码转换

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
学习交流
热门图片

新闻热点

疑难解答

图片精选

网友关注