加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 如何绘制图像的一部分?

发布时间:2020-12-15 09:18:55 所属栏目:大数据 来源:网络整理
导读:我有一个普通的Bitmap加载PNG Image.以下代码显示整个图像;但我要找的是像下面的示例一样显示.我基本上想要减少它将被绘制的虚拟“位置”.请注意,我不能仅仅因为有人问我可以枚举的原因来调整PaintBox的大小.我想我必须使用Rects和/或一些复制功能,但我自己
我有一个普通的Bitmap加载PNG Image.以下代码显示整个图像;但我要找的是像下面的示例一样显示.我基本上想要减少它将被绘制的虚拟“位置”.请注意,我不能仅仅因为有人问我可以枚举的原因来调整PaintBox的大小.我想我必须使用Rects和/或一些复制功能,但我自己也搞不清楚.有谁知道怎么办?

procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
    PaintBox1.Canvas.Brush.Color := clBlack;
    PaintBox1.Brush.Style := bsSolid;
    PaintBox1.Canvas.FillRect(GameWindow.Screen.ClientRect);
    PaintBox1.Canvas.Draw(0,FBitmap,FOpacity);
end;

解决方法

一种方法是修改paintbox画布的剪裁区域:

...
IntersectClipRect(PaintBox1.Canvas.Handle,20,PaintBox1.Width - 20,PaintBox1.Height - 20);
PaintBox1.Canvas.Draw(0,FOpacity);

当然,我确定你知道你的Canvas.Draw调用中的0,0是坐标.你可以画到你喜欢的地方:

...
FBitmap.Canvas.CopyRect(Rect(0,80,80),FBitmap.Canvas,Rect(20,100,100));
FBitmap.SetSize(80,80);
PaintBox1.Canvas.Draw(20,FOpacity);

如果您不想剪切绘图框的区域,并且不想修改源位图(FBitmap),并且不想对其进行临时复制,则可以直接调用AlphaBlend而不是通过Canvas.画:

var
  BlendFn: TBlendFunction;
begin
  BlendFn.BlendOp := AC_SRC_OVER;
  BlendFn.BlendFlags := 0;
  BlendFn.SourceConstantAlpha := FOpacity;
  BlendFn.AlphaFormat := AC_SRC_ALPHA;

  winapi.windows.AlphaBlend(PaintBox1.Canvas.Handle,PaintBox1.Height - 20,FBitmap.Canvas.Handle,BlendFn);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读