Цитата:
...я изменяю размеры 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 не знаю, не пытался делать. Насколько помню, ничего особенного, почти все так же.