TImage宽度为双精度值,而不是整数

时间:2019-04-02 17:06:15

标签: delphi vcl

如何将TImage大小设置为双精度值?示例Image1.width:= 50.1;或什么组件接受它,因为TImage仅接受整数值。

我正在处理下载文件,一个图像应该是要下载的元素数,因此Image1.width的最大值是340,我需要将此值除以将要下载的文件数量,然后增加每次下载完成时,此值在image1.width上,但是TImage仅接受Integer值。

我已经使用“ Round”做到了,但这不是我所需要的。

2 个答案:

答案 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可能不是最佳的图形系统。为了快速参考,以下是上面的结果:

enter image description here

答案 1 :(得分:1)

假设您正在使用VCL框架,则Delphi中的所有控件均基于Integer。您根本无法分配浮点值,除非没有先将其转换为整数。

另一方面,Firemonkey框架广泛基于浮点值。