Ширина изображения с двойным значением вместо целого - PullRequest
0 голосов
/ 02 апреля 2019

Как я могу установить размер TImage как двойное значение? Пример Image1.width: = 50,1; или какой компонент принимает его, потому что TImage принимает только целочисленные значения.

Я работаю с загружаемыми файлами, и одним изображением должно быть количество загружаемых элементов, поэтому максимальное значение Image1.width составляет 340, мне нужно разделить это значение на количество файлов, которые будут загружены, и увеличить это значение в image1.width после каждой загрузки, но TImage принимает только целочисленное значение.

Я уже сделал это, используя «Раунд», но это не то, что мне нужно.

Ответы [ 2 ]

2 голосов
/ 03 апреля 2019

Когда ответил , вы не можете установить размер изображения в любое значение с плавающей запятой.

Однако, используя пространства координат и функции преобразования , вы можете установить произвольное преобразование между логической системой координат и устройством просмотра.Это можно использовать для увеличения логической степени размера холста изображения при каждой загрузке, но при этом сохранить изображение на экране совершенно другого размера.

Приведенный ниже пример демонстрирует концепцию, рисуя 4 строки и 4 столбца.изображения 256x256 на растровом холсте 105x105 на TPicture of TImage.В основном это позволяет нарисовать одно изображение 256x256 на 26.25x26.25 px.поверхность.

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 голос
/ 02 апреля 2019

Предполагается, что вы используете платформу VCL, все элементы управления в Delphi основаны на Integer. Вы просто не можете присвоить значение с плавающей запятой, не превратив его в целое число.

С другой стороны, платформа Firemonkey широко основана на значениях с плавающей точкой.

...