Модераторы: Snowy, Alexeis, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Маштабирование объектов находящихся в Image 
:(
    Опции темы
Vitaly333
Дата 11.11.2006, 01:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 6.11.2006
Где: Volgograd

Репутация: нет
Всего: 2



На Image есть некоторые динамически создаваемые объекты(квадраты), координаты каждого квадрата также есть.

Нужно произвести правильное масштабирование. Ввел некий маштабирующий множитель. ®
Сначала: r:=1;
При уменьшении масштаба делал так: r:=r-0.1;
При увеличении масштаба : r:=r+0.1;
Потом  перерисовывались все объекты заново с новыми координатами x*r и y*r;

Но это мне кажется не правильным. Может есть какой -нибудь другой способ? Хотелось бы сделать так: Выделяешь прямоугольной областью фрагмент Image  - и этот фрагмент растягиваешь на весь Image и потом уже либо увеличиваешь либо уменьшаешь его. Но пока не знаю как это сделать.    


PM MAIL   Вверх
Alexeis
Дата 11.11.2006, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Цитата(Vitaly333 @  11.11.2006,  01:33 Найти цитируемый пост)
Выделяешь прямоугольной областью фрагмент Image  - и этот фрагмент растягиваешь на весь Image

Нужно соблюдать соотношение сторон?
Вообще не вижу ничего сложного. Из соотношения сторон (скажем текущая высота и высота выделения), всегда можно вычислить коэффициент масштабирования.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Bitter
Дата 11.11.2006, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1209
Регистрация: 15.8.2004
Где: Харьков, Ukraine

Репутация: 6
Всего: 27



Для этого придется работать с тремя 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.


PM MAIL ICQ Skype   Вверх
Vitaly333
Дата 12.11.2006, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 6.11.2006
Где: Volgograd

Репутация: нет
Всего: 2



Цитата

 BitBlt(Image2.Picture.Bitmap.Canvas, 0,0,W,H,
          Image1.Picture.Bitmap.Canvas, 0,0,SRCCOPY);


Эта функция не хочет работать - пишет что не совместимы типы HDC и TCanvas.

Я попробовал немножко по другому. Вот мой код:
Код

Var
RectX1,RectY1,RectX2,RectY2,sx,sy:integer;//Координаты выделенного прямоугольника
moving:boolean;
SelectRect:Trect; //Выделенный прямоугольник


 Procedure DrawRect;
Var
x1,y1,x2,y2:integer;
 Begin
 //Рисуем 2-прямоугольника на Image 1
x1:=50;
x2:=100;
y1:=50;
y2:=100;
Form1.Image1.Canvas.Rectangle(x1,y1,x1+20,y1+20);
Form1.Image1.Canvas.Rectangle(x2,y2,x2+20,y2+20);
 end;


Procedure Scale;
Var
Rect1,Rect2,aRect:Trect;
W,H:integer;
savex,savey:integer;
Begin
//обновляем холсты
Form1.Image2.Canvas.Brush.Color:=clWhite;
Form1.Image2.Canvas.Rectangle(0,0,Form1.Image2.Width,Form1.Image2.Height);
Form1.Image3.Canvas.Brush.Color:=clWhite;
Form1.Image3.Canvas.Rectangle(0,0,Form1.Image3.Width,Form1.Image3.Height);

W:=Form1.Image1.Picture.Bitmap.Width;
H:=Form1.Image1.Picture.Bitmap.Height;
SetRect(Rect1,0,0,W,H); //Копируемая область с Image1
//Копируем холст из Image1 в Image2
Form1.Image2.Picture.Bitmap.Canvas.CopyRect(Rect1,
Form1.Image1.Picture.Bitmap.Canvas,
Rect1);

if Rectx1>Rectx2 then begin
savex:=Rectx1;
Rectx1:=Rectx2;
Rectx2:=savex;
end;

if Recty1>Recty2 then begin
savey:=Recty1;
Recty1:=Recty2;
Recty2:=savey;
end;

SetRect(SelectRect,Rectx1,Recty1,Rectx2,Recty2); //Размер области, которую выделили
SetRect(Rect2,0,0,Rectx2,Recty2); //Размер области Image3,в которую копируем
//Копируем холст из Image2 в Image3
Form1.Image3.Picture.Bitmap.Canvas.CopyRect(Rect2,
Form1.Image2.Picture.Bitmap.Canvas,
SelectRect);
SetRect(ARect,0,0,W,H); //Областью на весь Image1
//Рисуем на Image1
Form1.Image1.Picture.Bitmap.Canvas.StretchDraw(ARect,Form1.Image3.Picture.Bitmap);

end;


procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 if moving=true then begin
//Запоминаем конечную точку выделенного прямоугольника
 RectX2:=X;
 RectY2:=Y;
moving:=false;
exit;
 end;

 if moving=false then begin
//Запоминаем начальную точку выделенного прямоугольника
 RectX1:=X;
 Recty1:=Y;
sx:=X;
sy:=y;
moving:=true;
end;

end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
//Анимация при выделении какого-либо участка  на Image1
if moving=true then begin
//стирание прямоугольника
Image1.Canvas.Pen.Color:=clWhite;
Image1.Canvas.Rectangle(Rectx1,Recty1,sx,sy);
//приращение координат
sx:=X;
sy:=y;
//отрисовка прямоугольника
Image1.Canvas.Pen.Color:=clBlack;
Image1.Canvas.Rectangle(Rectx1,Recty1,X,Y);
DrawRect;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
DrawRect;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Scale;
end;
end.


Не очень то правильно получается...

PM MAIL   Вверх
Vitaly333
Дата 12.11.2006, 00:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 6.11.2006
Где: Volgograd

Репутация: нет
Всего: 2



C BitBlt уже разобрался , просто ты забыл указать ссылку на холст:
Код

BitBlt(Image2.Picture.Bitmap.Canvas.Handle, 0,0,W,H,
          Image1.Picture.Bitmap.Canvas.Handle, 0,0,SRCCOPY);


PM MAIL   Вверх
Alexeis
Дата 12.11.2006, 01:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Vitaly333, а я то думал, что идет векторное сжатие... тогда бы уже заменил 
Код

Canvas.StretchDraw(ARect,Form1.Image3.Picture.Bitmap);

на SreatchBlt(), все равно именно ее и вызывает Canvas.StretchDraw


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Bitter
Дата 12.11.2006, 02:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1209
Регистрация: 15.8.2004
Где: Харьков, Ukraine

Репутация: 6
Всего: 27



Цитата

C BitBlt уже разобрался , просто ты забыл указать ссылку на холст:


:-), пардон...

Ну и? Заработало?
PM MAIL ICQ Skype   Вверх
Vitaly333
Дата 12.11.2006, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 6.11.2006
Где: Volgograd

Репутация: нет
Всего: 2



Цитата

Ну и? Заработало?

Вместо 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 К высоте выделенного прямоугольника);

И потом перерисовывал эти два квадрата ,умножая их координаты на эти масш. множители:
Код

x1:=Round(rx*(50));
x2:=Round(rx*(100));
y1:=Round(ry*(50));
y2:=Round(ry*(100));
Form1.Image1.Canvas.Pen.Color:=clBlack;
Form1.Image1.Canvas.Rectangle(x1,y1,Round(x1+rx*20),Round(y1+ry*20));
Form1.Image1.Canvas.Rectangle(x2,y2,Round(x2+rx*20),Round(y2+ry*20));

Но уже перерисованные не соответсвовали отмаштабированным.
Если бы они соответствовали то, то можно было маштабировать уже маштабированный  участок ещё много раз.

Да вот ещё - при ещё 1-ом маштабировании почему-то фигуры, которые раньше были квадратами стали прямоугольниками на маштабируемом Image1. 

PM MAIL   Вверх
Alexeis
Дата 12.11.2006, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Цитата(Vitaly333 @  12.11.2006,  21:55 Найти цитируемый пост)
Да вот ещё - при ещё 1-ом маштабировании почему-то фигуры, которые раньше были квадратами стали прямоугольниками на маштабируемом Image1. 

Это нормальный эффект при не соблюдении пропорций. Для того, чтобы этого не было необходимо использовать один и тот же масштабный коэффициент как для ширины так для высоты.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Vitaly333
Дата 13.11.2006, 02:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 6.11.2006
Где: Volgograd

Репутация: нет
Всего: 2



Цитата

необходимо использовать один и тот же масштабный коэффициент как для ширины так для высоты. 


Т.е оставить только rx или только ry. Но при перерисовке перерисованные квадраты всё равно не совпадают с  отмаштабированными.
PM MAIL   Вверх
Alexeis
Дата 13.11.2006, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Цитата(Vitaly333 @  13.11.2006,  02:21 Найти цитируемый пост)
Но при перерисовке перерисованные квадраты всё равно не совпадают с  отмаштабированными. 

Что опять квадрат --> прямоугольник
Как не совпадают? Пожалуйста, не заставляйте нас проводить спиритические сеансы, описывайте проблему четко. А некоторые доходят до того, что пишут типа, я писал программу с массивами, но она почему-то не работает, не скажете почему? smile 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Vitaly333
Дата 15.11.2006, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 6.11.2006
Где: Volgograd

Репутация: нет
Всего: 2



Цитата

 Пожалуйста, не заставляйте нас проводить спиритические сеансы, описывайте проблему четко.


А я разве выше проблему не четко писал?

Цитата

Что опять квадрат --> прямоугольник? 


Нет. После введения только одного масш. множителя квадрат при перерисовке рисуется квадратом. 

Цитата

Как не совпадают?


Когда я выделяю прямоугольную область , то она растягивается по размерам Image1(Маштабируется). Но для того чтобы произвести 2- ое маштабирование нужно чтобы квадраты со старыми координатами были перерисованы с новыми,для этого я умножаю старые на масш. коэффициент. Но при перерисовке новые координаты квадратов не совпадают с маштабированными.
PM MAIL   Вверх
Alexeis
Дата 15.11.2006, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Цитата(Vitaly333 @  15.11.2006,  17:09 Найти цитируемый пост)
Когда я выделяю прямоугольную область , то она растягивается по размерам Image1(Маштабируется). Но для того чтобы произвести 2- ое маштабирование нужно чтобы квадраты со старыми координатами были перерисованы с новыми,для этого я умножаю старые на масш. коэффициент. Но при перерисовке новые координаты квадратов не совпадают с маштабированными. 

Неа так нельзя! Нужно сохраниять исходные размеры и пересчитывать всегда через них. Пусть лучше погрешность будет в увеличении. Это же не страшно, чем размеры 100% не будет соответствовать истинным 100%.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Vitaly333
Дата 16.11.2006, 01:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 6.11.2006
Где: Volgograd

Репутация: нет
Всего: 2



Вот что я написал посмотри когда время будет

Программа Scale
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




[ Время генерации скрипта: 0.1292 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.