| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Звук, графика и видео > Маштабирование объектов находящихся в Image |
| Автор: Vitaly333 11.11.2006, 01:33 |
| На Image есть некоторые динамически создаваемые объекты(квадраты), координаты каждого квадрата также есть. Нужно произвести правильное масштабирование. Ввел некий маштабирующий множитель. ® Сначала: r:=1; При уменьшении масштаба делал так: r:=r-0.1; При увеличении масштаба : r:=r+0.1; Потом перерисовывались все объекты заново с новыми координатами x*r и y*r; Но это мне кажется не правильным. Может есть какой -нибудь другой способ? Хотелось бы сделать так: Выделяешь прямоугольной областью фрагмент Image - и этот фрагмент растягиваешь на весь Image и потом уже либо увеличиваешь либо уменьшаешь его. Но пока не знаю как это сделать. |
| Автор: Bitter 11.11.2006, 16:37 |
| Для этого придется работать с тремя Image'ами. 1. Первый Image будет отображать рабочее поле (смаштабированное изображение), кроме того на него производится вывод твоего лабиринта. 2. После отображения участка лабиринта, копируешь его в Image2: BitBlt(Image2.Picture.Bitmap.Canvas, 0,0,W,H, Image1.Picture.Bitmap.Canvas, 0,0,SRCCOPY); В этом Image будем выделять область для масштабирования (Пользователь выделяет область на Image1, а изображение берётся из Image2) 3. При выделении прямоугольником, запоминаешь Начальную точку и конечную. Тут есть тонкость: если координата Х конечной точки меньше начальной - меняешь их местами. Тоже самое с координатой Y. 4. Копируешь полученный косок из Image2 в Image3: BitBlt(Image3.Picture.Bitmap.Canvas, 0,0,Rec.W,Rec.H, Image2.Picture.Bitmap.Canvas, Rec.StartX,Rec.StartY,SRCCOPY); Здесь Rec - прямоугольник выделения. 5. Копируешь Image3 в Image1 с увеличением: Image1.Picture.Bitmap.Canvas.StretchDraw(aRect,Image3.Picture.Bitmap); Здесь var aRect:TRect; .... SetRect(aRect,0,0,W,H); W и H - ширина и высота Image1 6. При нажатии кнопок "+" или "-", ты можешь увеличивать или уменьшать размеры прямоугольника Rec. только следи, чтобы его размеры не привышали W и H. |
| Автор: Vitaly333 12.11.2006, 00:05 | ||||
Эта функция не хочет работать - пишет что не совместимы типы HDC и TCanvas. Я попробовал немножко по другому. Вот мой код:
Не очень то правильно получается... |
| Автор: Vitaly333 12.11.2006, 00:47 | ||
C BitBlt уже разобрался , просто ты забыл указать ссылку на холст:
|
| Автор: Alexeis 12.11.2006, 01:20 | ||
Vitaly333, а я то думал, что идет векторное сжатие... тогда бы уже заменил
на SreatchBlt(), все равно именно ее и вызывает Canvas.StretchDraw |
| Автор: Bitter 12.11.2006, 02:14 | ||
:-), пардон... Ну и? Заработало? |
| Автор: Vitaly333 12.11.2006, 21:55 | ||||
Вместо Form1.Image1.Picture.Bitmap.Canvas.StretchDraw(ARect,Form1.Image3.Picture.Bitmap) я поставил просто копирование выделенного куска с Image3 на Image1: Form1.Image1.Picture.Bitmap.Canvas.CopyRect(ARect, Form1.Image3.Picture.Bitmap.Canvas, Rect2); Где Arect - это (0,0,W,H); Rect2 - это (0,0,RectX2,RectY2). Всё отлично промаштабировалось, но если ещё раз произвести маштабирование на уже маштабированном Image1 то получается маштабируются и старые координаты двух квадратов которые были нарисованы на Image до 1-ого маштабирования и уже маштабированные квадраты - и получается какая-то "бяка". Т.е Нужно при каждом маштабировании перерисовывать прямоугольники с новыми координатами. Но как узнать маштабный множитель по X и по Y. Пробовал вот так,как говорил Alexeis1: rx:=W/abs(RectX2-RectX1) - Маштабный множитель по X (Отношение ширины Image1 к ширине выделенного прямоугольника); ry:=H/abs(Recty2-Recty1) - Маштабный множитель по Y (Отношение высоты Image1 К высоте выделенного прямоугольника); И потом перерисовывал эти два квадрата ,умножая их координаты на эти масш. множители:
Но уже перерисованные не соответсвовали отмаштабированным. Если бы они соответствовали то, то можно было маштабировать уже маштабированный участок ещё много раз. Да вот ещё - при ещё 1-ом маштабировании почему-то фигуры, которые раньше были квадратами стали прямоугольниками на маштабируемом Image1. |
| Автор: Alexeis 12.11.2006, 22:02 | ||
Это нормальный эффект при не соблюдении пропорций. Для того, чтобы этого не было необходимо использовать один и тот же масштабный коэффициент как для ширины так для высоты. |
| Автор: Vitaly333 13.11.2006, 02:21 | ||
Т.е оставить только rx или только ry. Но при перерисовке перерисованные квадраты всё равно не совпадают с отмаштабированными. |
| Автор: Alexeis 13.11.2006, 10:00 | ||
Что опять квадрат --> прямоугольник? Как не совпадают? Пожалуйста, не заставляйте нас проводить спиритические сеансы, описывайте проблему четко. А некоторые доходят до того, что пишут типа, я писал программу с массивами, но она почему-то не работает, не скажете почему? |
| Автор: Vitaly333 15.11.2006, 17:09 | ||||||
А я разве выше проблему не четко писал?
Нет. После введения только одного масш. множителя квадрат при перерисовке рисуется квадратом.
Когда я выделяю прямоугольную область , то она растягивается по размерам Image1(Маштабируется). Но для того чтобы произвести 2- ое маштабирование нужно чтобы квадраты со старыми координатами были перерисованы с новыми,для этого я умножаю старые на масш. коэффициент. Но при перерисовке новые координаты квадратов не совпадают с маштабированными. |
| Автор: Alexeis 15.11.2006, 17:19 | ||
Неа так нельзя! Нужно сохраниять исходные размеры и пересчитывать всегда через них. Пусть лучше погрешность будет в увеличении. Это же не страшно, чем размеры 100% не будет соответствовать истинным 100%. |
| Автор: Vitaly333 16.11.2006, 01:25 |
| Вот что я написал посмотри когда время будет http://noname10686.narod.ru/programs/Scale.rar |