Как вы увеличиваете и уменьшаете изображение с помощью TrackBar в Delphi 2010 [дубликат]

Весь этот ответ находится в контексте соответствия спецификации, а не того, что движок делает в определенный момент или исторически.

Как правило, нет

. Фактический вопрос очень расплывчатый.

свойства будут в том же порядке, что я добавил их

В каком контексте?

] Ответ: это зависит от ряда факторов. В общем случае, no .

Иногда да

Здесь вы можете рассчитывать на порядок ключей свойств для простых объектов :

  • ES2015 совместимый движок
  • Собственные свойства
  • Object.getOwnPropertyNames () , Reflect.ownKeys () , Object.getOwnPropertySymbols (O)

Во всех случаях эти методы включают в себя неперечислимые ключи свойств и ключи заказа, как указано в [ [OwnPropertyKeys]] (см. Ниже). Они отличаются типом ключевых значений, которые они включают ( String и / или Символ ). В этом контексте String включает в себя целочисленные значения.

Object.getOwnPropertyNames (O)

Возвращает O String -keyed свойства ( имена свойств ).

Reflect.ownKeys (O)

Возвращает O собственные String - и Символы -ключевые свойства.

Объект. getOwnPropertySymbols (O)

Возвращает O собственные Символы -keyed.

[ [OwnPropertyKeys]]

Порядок по существу: целочисленный Строки в порядке возрастания, нецелоподобные Строки в создании порядок, Символы в порядке создания. В зависимости от того, какая функция вызывает это, некоторые из этих типов могут не включаться.

Специфическим языком является то, что ключи возвращаются в следующем порядке:

  1. .. каждый собственный ключ свойства P из O [объект, который повторяется], который является целым индексом, в порядке возрастания числового индекса
  2. ... каждый собственный ключ свойства P из O , который является строкой, но не является целым индексом, в порядке создания свойства
  3. ... каждый собственный ключ свойства P of O , который является символом в порядке создания свойства

Карта

Если вас интересуют упорядоченные карты, вы должны рассмотреть использование типа Map , введенного в ES2015, вместо простого объектов .

2
задан Himadri 12 June 2010 в 11:00
поделиться

1 ответ

Код, на который вы ссылаетесь, устанавливает преобразование из одного координатного пространства в другое, я не заметил ничего, что бы вырезать / обрезать изображение. Однако вместо того, чтобы иметь коэффициент обратно пропорционального увеличения, я бы предпочел бы, легко понять, линейное масштабирование. Кроме того, я не вижу причин переключать режимы карты в зависимости от коэффициента масштабирования, я бы изменил SetCanvasZoomFactor следующим образом:

procedure SetCanvasZoomPercent(Canvas: TCanvas; AZoomPercent: Integer);
begin
  SetMapMode(Canvas.Handle, MM_ISOTROPIC);
  SetWindowExtEx(Canvas.Handle, 100, 100, nil);
  SetViewportExtEx(Canvas.Handle, AZoomPercent, AZoomPercent, nil);
end;

Упрощенный (без проверки ошибок) рабочий пример с растровым изображением, загруженным в TImage, масштабированный с помощью TrackBar, может выглядеть следующим образом. Обратите внимание, что вышеуказанная функция встроена в событие OnChange в TrackBar.

type
  TForm1 = class(TForm)
    imgmain: TImage;
    TrackBar1: TTrackBar;
    Label1: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure TrackBar1Change(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    bmpmain: TBitmap;
  [..]

[...]
procedure TForm1.FormCreate(Sender: TObject);
begin
  bmpmain := TBitmap.Create;
  bmpmain.LoadFromFile(ExtractFilePath('samplebitmap.bmp');
  bmpmain.PixelFormat := pf32bit; // No significance, just seems faster here than pf24bit

  TrackBar1.Min := 10;
  TrackBar1.Max := 200;
  TrackBar1.Frequency := 10;
  TrackBar1.PageSize := 10;
  TrackBar1.Position := 100; // Fires OnChange
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
 bmpmain.Free;
end;

procedure TForm1.TrackBar1Change(Sender: TObject);
var
  Zoom, x, y: Integer;
begin
  Zoom := TrackBar1.Position;
  if not (Visible or (Zoom = 100)) or (Zoom = 0) then
    Exit;

  SetMapMode(imgmain.Canvas.Handle, MM_ISOTROPIC);
  SetWindowExtEx(imgmain.Canvas.Handle, 100, 100, nil);
  SetViewportExtEx(imgmain.Canvas.Handle, Zoom, Zoom, nil);
  x := imgmain.Width * 50 div Zoom - bmpmain.Width div 2;
  y := imgmain.Height * 50 div Zoom - bmpmain.Height div 2;
  imgmain.Canvas.Draw(x, y, bmpmain);
  if (x > 0) or (y > 0) then begin
    imgmain.Canvas.Brush.Color := clWhite;
    ExcludeClipRect(imgmain.Canvas.Handle, x, y, x + bmpmain.Width, y + bmpmain.Height);
    imgmain.Canvas.FillRect(imgmain.Canvas.ClipRect);
  end;

  Label1.Caption := 'Zoom: ' + IntToStr(TrackBar1.Position) + '%';
end;


изменить : тот же код с TImage в ScrollBox;

type
  TForm1 = class(TForm)
    TrackBar1: TTrackBar;
    Label1: TLabel;
    ScrollBox1: TScrollBox;
    imgmain: TImage;
    procedure FormCreate(Sender: TObject);
    procedure TrackBar1Change(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    bmpmain: TBitmap;
  [...]
[...]

const
  FULLSCALE = 100;

procedure TForm1.FormCreate(Sender: TObject);
begin
  imgmain.Left := 0;
  imgmain.Top := 0;

  bmpmain := TBitmap.Create;
  bmpmain.LoadFromFile(ExtractFilePath(Application.ExeName) + '610x.bmp');
  bmpmain.PixelFormat := pf32bit;

  TrackBar1.Min := FULLSCALE div 10;   // %10
  TrackBar1.Max := FULLSCALE * 2;      // %200
  TrackBar1.PageSize := (TrackBar1.Max - TrackBar1.Min) div 19;
  TrackBar1.Frequency := TrackBar1.PageSize;
  TrackBar1.Position := FULLSCALE;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  bmpmain.Free;
end;

procedure TForm1.TrackBar1Change(Sender: TObject);
var
  Zoom: Integer;
begin
  Zoom := TrackBar1.Position;
  if not (Visible or (Zoom = FULLSCALE)) or (Zoom = 0) then
    Exit;

  SetMapMode(imgmain.Canvas.Handle, MM_ISOTROPIC);
  SetWindowExtEx(imgmain.Canvas.Handle, FULLSCALE, FULLSCALE, nil);
  SetViewportExtEx(imgmain.Canvas.Handle, Zoom, Zoom, nil);

  imgmain.Width := Round(bmpmain.Width * Zoom / FULLSCALE);
  imgmain.Height := Round(bmpmain.Height * Zoom / FULLSCALE);
  if Assigned(imgmain.Picture.Graphic) then begin
    imgmain.Picture.Graphic.Width := imgmain.Width;
    imgmain.Picture.Graphic.Height := imgmain.Height;
  end;
  imgmain.Canvas.Draw(0, 0, bmpmain);

  Label1.Caption := 'Zoom: ' +
      IntToStr(Round(TrackBar1.Position / FULLSCALE * 100)) + '%';
end;
8
ответ дан Sertac Akyuz 17 August 2018 в 10:41
поделиться
  • 1
    @Sertac Thanx, Это лучше, чем код, который я использовал. Но можете ли вы сказать мне, что такое значение строки: imgmain.Canvas.Draw (x, y, bmpmain); потому что перед этой строкой мы не меняем bmpmain, то почему мы рисуем ее imgmain? И, говоря словами, вырезая изображение, я имею в виду, что после масштабирования он не увеличивал фактическую длину изображения, но мне нужно полное изображение, которое я тоже не получил от этого кода. Еще одна вещь, я поместил изображение в TScrollBar, это создает проблему? – Himadri 14 June 2010 в 06:31
  • 2
    @Himadri - мы никогда не меняем bmpmain, мы только изменяем соотношение между логическими единицами и единицами устройства на холсте TImage. Позвольте мне попробовать пример; Предположим, у вас есть растровое изображение шириной 96 пикселей, если ваш Screen.PixelsPerInch также 96px imgmain.Canvas.Draw(x,y,bmpmain) будет рисовать 1 & quot; ширину растрового изображения на TImage. В режиме изотропного отображения, если вы установите размер горизонтального окна на 100 и горизонтальную область просмотра до 200, вы говорите, что 100 логических единиц на оси x будут представлены с 200px. Таким образом, один и тот же вызов будет рисовать растровое изображение 192px или 2 " или в два раза больше ширины. – Sertac Akyuz 14 June 2010 в 10:34
  • 3
    @ Himadri- Вы можете поместить TImage в поле прокрутки, конечно. Всякий раз, когда вы меняете масштаб, перед рисованием изображения вы должны рассчитать и установить новую ширину / высоту изображения. Для примера выше это будет f.i. imgmain.Width := bmpmain.Width * Zoom div 100; – Sertac Akyuz 14 June 2010 в 10:59
  • 4
    @Sertac Я написал эту строку, но она не меняет ширину imgmain. Не хватает ли какой-либо собственности? Моя проблема обрезанного изображения еще не решена. – Himadri 15 June 2010 в 11:32
  • 5
    @ Химадри. Кажется, я понимаю, что вы имеете в виду. Кажется, что если графику присвоено изображение изображения, установка размера изображения не влияет на размер графического изображения. Я обновил ответ, попробуйте с новым кодом. – Sertac Akyuz 15 June 2010 в 14:26
Другие вопросы по тегам:

Похожие вопросы: