Показать сообщение отдельно
  #7  
Старый 05.08.2008, 01:03
san-46 san-46 вне форума
Активный
 
Регистрация: 25.04.2008
Сообщения: 383
Репутация: 33
По умолчанию

Цитата:
...я изменяю размеры PaintBox
Как раз этого и нельзя делать - такая дискотека будет (особенно при больших масштабах), мало не покажется.

Вот поэкспериментировал - ничего не дергается, плавно увеличивает масштаб. (Это более правильный вариант).
Код:
var
  BS, BT : TBitmap;

procedure TForm1.FormCreate(Sender: TObject);
begin
  BS := TBitmap.Create;
  BS.LoadFromFile(<FileName>);
  BT := TBitmap.Create;
  PaintBox1.ControlStyle := PaintBox1.ControlStyle + [csOpaque]; //обязательно
end;

procedure TForm1.TrackBar1Change(Sender: TObject);
begin
  PaintBox1.Invalidate;
end;

procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
  BT.Width := BS.Width + (TrackBar1.Position-1) * 2;
  BT.Height := BS.Height + (TrackBar1.Position-1) * 2;
  BT.Canvas.StretchDraw(Rect(0, 0, BT.Width, BT.Height), BS);
  PaintBox1.Canvas.CopyRect(PaintBox1.ClientRect, BT.Canvas, PaintBox1.ClientRect);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  BT.Free;
  BS.Free;
end;
Еще нужна проверка при уменьшении масштаба, если картинка становится меньше размера PaintBox. Думаю, что и как делать при этом придумать можно.
Да, еще. Код только масштабирует, но не прокручивает картинку. Для прокрутки код надо переделывать-доделывать.

Здесь, главное, идея. А идея в том, что исходная картинка храниться в памяти, не высовывается (BS). Хранить исходную обязательно.
Масштаб меняется изменением размеров промежуточного bitmap (BT) тоже в памяти. В него перегоняется исходная картинка, которая с помощью StretchDraw меняет свой размер. И последнее действие выводит ЧАСТЬ изображения на канву визуального компонент (здесь PainBox, можно на другие компоненты, которые имеют Canvas).

Ага, еще. Скроллбокс здесь не годится. Т.е. PaintBox вставлять в ScrollBox не получится. А систему отображения надо представить в виде окошка, через которое мы видим только часть картинки (CopyRect). При прокрутке (текущий масштаб) просто надо смещать прямоугольник с одним и тем же размером (размер визуального компонента) по вертикали и горизонтали. Как будто мы перемещаем наше окошко по большой картинке.

Как с jpeg не знаю, не пытался делать. Насколько помню, ничего особенного, почти все так же.
__________________
Не забывайте делать резервные копии
Ответить с цитированием