如何绘制图像的一部分? [英] How to draw part of a image?
问题描述
我有一个普通的Bitmap加载了一个PNGImage。以下代码显示整个图像;但我正在寻找的是像下面的示例显示为例。我想基本上减少虚拟的地方,它将被绘。注意,我不能只是调整大小的PaintBox的原因,我可以枚举,如果有人问。我想我必须使用Rects和一些复制功能,但我不知道自己。有人知道如何做吗?
I have an ordinary Bitmap loaded with a PNGImage. The following code shows the whole image; but what I am looking for is to show like the sample below for example. I want basically to reduce the virtual "place" where it would be painted. Note that I can't just resize the PaintBox by reasons I can enumerate if someone asks. I guess I have to use Rects and or some Copy function, but I could not figure out by myself. Does anyone know how to do?
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, 0, FBitmap, FOpacity);
end;
推荐答案
一种方法是修改paintbox画布的剪裁区域:
One way is to modify the clipping region of your paintbox's canvas:
...
IntersectClipRect(PaintBox1.Canvas.Handle, 20, 20,
PaintBox1.Width - 20, PaintBox1.Height - 20);
PaintBox1.Canvas.Draw(0, 0, FBitmap, FOpacity);
当然,我确定你知道<$ c $您的 Canvas.Draw
调用中的c>(0,0 )是坐标,您可以根据自己的喜好绘制:
Of course, I'm sure you're aware that the (0, 0
in your Canvas.Draw
call are coordinates. You can draw to whereever you like:
...
FBitmap.Canvas.CopyRect(Rect(0, 0, 80, 80), FBitmap.Canvas,
Rect(20, 20, 100, 100));
FBitmap.SetSize(80, 80);
PaintBox1.Canvas.Draw(20, 20, FBitmap, FOpacity);
如果您不想剪辑绘图区域,不要修改源位图(FBitmap ),并且不想制作它的临时副本,则可以直接调用 AlphaBlend
,而不是通过 Canvas.Draw
:
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,
20, 20, PaintBox1.Width - 20, PaintBox1.Height - 20,
FBitmap.Canvas.Handle, 20, 20, PaintBox1.Width - 20, PaintBox1.Height - 20,
BlendFn);
这篇关于如何绘制图像的一部分?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!