如何将TImage大小设置为双精度值?示例Image1.width:= 50.1;或什么组件接受它,因为TImage仅接受整数值。
我正在处理下载文件,一个图像应该是要下载的元素数,因此Image1.width的最大值是340,我需要将此值除以将要下载的文件数量,然后增加每次下载完成时,此值在image1.width上,但是TImage仅接受Integer值。
我已经使用“ Round”做到了,但这不是我所需要的。
答案 0 :(得分:2)
与answered一样,您不能将图像的大小设置为任何浮点值。
但是,使用coordinate spaces and transformations函数,可以在逻辑坐标系和查看设备之间设置任意变换。每次下载时,这都可以用来增加图像画布大小的逻辑范围,而将图像以完全不同的大小保留在屏幕上。
以下示例通过在TImage的TPicture的105x105位图画布上绘制256x256图像的4行和4列来说明该概念。基本上可以实现在26.25x26.25 px上绘制单个256x256图像。表面。
uses
pngimage;
procedure TForm1.Button1Click(Sender: TObject);
const
Col = 4;
Row = 4;
var
Png: TPngImage;
ImgCanvas: TCanvas;
ExtX, ExtY: Integer;
MapMode: Integer;
Size: TSize;
i, j: Integer;
begin
Png := TPngImage.Create;
try
Png.LoadFromFile('...\Attention.png');
Png.Draw(Canvas, Rect(0, 0, Png.Width, Png.Height)); // original picture
Image1.Picture.Bitmap.Canvas.Brush.Color := Color;
Image1.Picture.Bitmap.SetSize(Image1.Width, Image1.Height);
ImgCanvas := Image1.Picture.Bitmap.Canvas;
SetStretchBltMode(ImgCanvas.Handle, HALFTONE);
MapMode := SetMapMode(ImgCanvas.Handle, MM_ISOTROPIC);
if MapMode <> 0 then
try
ExtX := Png.Width * Col;
ExtY := Png.Height * Row;
if not GetWindowExtEx(ImgCanvas.Handle, Size) then
RaiseLastOSError;
if not SetWindowExtEx(ImgCanvas.Handle, Size.cx * ExtX div Image1.Width,
Size.cy * ExtY div Image1.Height, nil) then
RaiseLastOSError;
if not SetViewportExtEx(ImgCanvas.Handle, Size.cx, Size.cy, nil) then
RaiseLastOSError;
i := 0;
j := 0;
while j < ExtY do begin
while i < ExtX do begin
Png.Draw(ImgCanvas, Rect(i, j, i + Png.Width, j + Png.Height));
Inc(i, Png.Width);
end;
i := 0;
Inc(j, Png.Height);
end;
finally
SetMapMode(ImgCanvas.Handle, MapMode);
end
else
RaiseLastOSError;
finally
Png.Free;
end;
end;
大概值得一提的是,当涉及缩放时,GDI可能不是最佳的图形系统。为了快速参考,以下是上面的结果:
答案 1 :(得分:1)
假设您正在使用VCL框架,则Delphi中的所有控件均基于Integer
。您根本无法分配浮点值,除非没有先将其转换为整数。
另一方面,Firemonkey框架广泛基于浮点值。