zubr, о другом речь. есть один Image 100х100 с картинкой 1000х1000, и есть второй Image 100х100. Нужно во втором Image показать
кусок первого, в масштабе 1:1.
2 ТС. разберитесь, как устроен TImage. Это - визуальный компонент, который можно двигать по форме, менять размеры, играться свойствами и т.д. У него есть свойство Canvas, которое, как у всех графических компонентов, занимается отрисовкой на экране. Далее, у него есть свойство Picture, которое может содержать какую-то картинку. насколько я понимаю, у вас это Bitmap. имеем:
Image1.Canvas - то, что мы видим на экране;
Image1.Picture.Bitmap.Canvas - реально загруженная картинка, ее "холст", так сказать.
Наша задача: взять кусок оригинального холста, отмасштабировать, и куда-то вывести. Это можно сделать функциями дельфи, но обычно это делается функциями виндового апи, типа BitBlt.
Эти функции, как правило, работают именно с канвасом (а точнее, GDI-ным дескриптором канваса, хэндлом, только это не виндовый хэндл, не дескриптор окна, а дескриптор объекта в графической подсистеме GDI. ну да не суть). Суть в том, что эти функции крайне примитивны, но работают на низком уровне и работают очень быстро, т.е. вполне можно масштабировать в реальном времени, типа, двигая ползунок на экране видеть, как меняется картинка.
Это первая часть задачи. Теперь вторая часть: куда выводить. Вариантов много. Например, в PaintBox. Но PaintBox рисует по событию OnPaint. т.е. нужно в этом событии выяснить, в каком масштабе юзер хочет видеть картинку, и какой ее кусок, выдрать его, и отрисоваться. Соответственно, когда юзер меняет масштаб или область, нужно тупо сказать PAintBox-у Invalidate, а он уже в своем событии нашими стараниями выяснит, чего инвалидэйт, и в каком масштабе.
Можно отрисовывать в некий виртуальным Bitmap. т.е. объявить поле, типа, fBitmap: TBitmap, при любых действиях пользователя (изменении масштаба или региона) формировать этот битмап (т.е. "выдранный" кусок из первого Image в нужном масштабе) и тупо его хранить. Я бы именно так и сделал. А вот уже потом его можно отрисовать куда угодно: заассайнить (assign) второму Image, или в PaintBox-е отрисовывать - не суть. Плюс здесь в том, что "математика" (т.е. наиболее ресурсоемкие действия, типа выдирания и масштабирования нужного куска) происходят единожды - по действию пользователя, а дальше мы тупо отрисовываем готовое изображение, наш виртуальный битмап. В первом же способе каждый раз при перерисовке PaintBox-а мы каждый раз пересчитываем изображение. Для современных компов это ерунда, но привыкать писать херню вредно, потом это уже не лечится.
Есть у вашей задачи и третий момент, как пользователь выделяет на первом Image нужный регион для масштабирования. Здесь имеет смысл рыть либо в сторону регионов (если нужно отмасштабировать непрямоугольный участок изображения, звезду, например), либо в сторону функции канвас DrawFocusedRect, если не ошибаюсь. (она, собственно, тоже на регионах работает, но это частный случай именно для рисования "двигающихся" рамок).
успехов
Добавлено через 2 минуты и 8 секунд:главное уясните для себя, что у любого Image два канваса: Image1.Canvas - это то, что мы видим, Image1.Picture.Bitmap.Canvas - это то, что реально есть.