我正在使用delphi 我有一个滚动框,我在其中放置TImage控件。现在我想缩放渲染到TImage控件中的图像。所以,我正在使用TCanvas的stretchDraw方法。我的代码是 -
if sbZoom.Down then begin
rct := imgmain.Picture.Bitmap.Canvas.ClipRect;
rct := Rect(rct.Left * 2,rct.Top * 2,rct.Right * 2,rct.Bottom * 2);
imgmain.Picture.Bitmap.Canvas.StretchDraw(rct,imgmain.Picture.Bitmap);
imgmain.Repaint;
end;
正确缩放图像,我的问题是我希望滚动框的大小也应该随着图像的缩放而改变。
Also explain me parameters of Canvas.StretchDraw method. I am little confused with it.
谢谢。
答案 0 :(得分:3)
如果不调用StretchDraw,您可以轻松完成此操作:
if Zoomed then begin
Image1.AutoSize := false;
Image1.Stretch := true;
Image1.Width := 2*Image1.Width;
Image1.Height := 2*Image1.Height;
end
else begin
Image1.Stretch := false;
Image1.AutoSize := true;
end;
AutoSize:= true确保TImage与内部图片的大小相同。在缩放过程中,我们关闭AutoSize并打开拉伸,因此图片大小调整为TImage大小(这里仍然相同)。然后我们将TImage的大小加倍以产生缩放效果。由于TImage现在更大,滚动框可以正常工作。
答案 1 :(得分:1)
Uwe Raabe正在为您提供正确的方法。这就是为什么你的方式不起作用的原因:滚动框将显示滚动条并帮助您查看整个控件。在您的情况下,它只会在TImage对象比Scrollbox大时显示滚动条。 Scrollbox不可能知道TImage的内部,所以它不关心TImage.Picture,它只关心控件。并且具有AutoSize = False的TImage不关心它的图片,它的大小始终保持不变。
您的代码将基本位图重新绘制到自身上。问题是,位图具有固定的宽度和高度:如果你在位图的区域外绘制,你基本上会被忽略。当你通过StretchDrawing将位图“缩放”到自身时(我很惊讶它开始工作!)你不会使位图变大,而且不适合的东西会被静默地剪掉。如果您确实希望内部位图改变大小,那么您首先需要创建一个新的更大的位图,将放大的图像绘制到新的位图,然后将位图分配给TImage。如果这样做,请确保TImage.AutoSize = True。
答案 2 :(得分:0)
您应该将图像控件的大小设置为位图的大小。