Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.04.2008, 15:09   #1
delphin100
Он лайн
Форумчанин
 
Аватар для delphin100
 
Регистрация: 26.09.2007
Сообщений: 173
Сообщение Поворот картинки

Такая задача возникла.
Есть картинка загруженная из файла как её повернуть по часовой (можно и против часовой) на указанное количество градусов.
Нужно для часов. Если есть другие идеи тогда подскажите как стрелки красивее линий сделать.
А также как рисовать вместо точки шаблон из файла (как бы печать ставить). Всем заранее спасибо
delphin100 вне форума Ответить с цитированием
Старый 13.04.2008, 15:18   #2
Карась
Участник клуба
 
Аватар для Карась
 
Регистрация: 26.10.2007
Сообщений: 1,244
По умолчанию

Неделю назад давал ссылки которые нашёл поисков...

В поиск.
Умом Россию не понять, пока не выпито ноль пять,
А если выпито ноль пять всё делом кажется не хитрым,
Попытка глубже понимать уже попахивает литром...
Карась вне форума Ответить с цитированием
Старый 13.04.2008, 16:10   #3
delphin100
Он лайн
Форумчанин
 
Аватар для delphin100
 
Регистрация: 26.09.2007
Сообщений: 173
По умолчанию

Тогда вторая часть вопроса что там

как рисовать на имадже загруженную картинку

Последний раз редактировалось Stilet; 14.04.2008 в 10:59.
delphin100 вне форума Ответить с цитированием
Старый 13.04.2008, 18:38   #4
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

во внешний поиск - исходник часов(циферблат, стрелки) на дельфи(Delphi)

как рисовать на имидже здесь на форуме уйма информации, также здесь же где-то есть как повернуть битмап на заданный угол
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 13.04.2008, 19:19   #5
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

mutabor, на форуме, к сожалению, очень неоптимальный и громоздкий способ попиксельного поворота картинок и/или переворачивания/отражения картинок. SetWorldTransform позволяет делать всё это за пару строк,причем с любыми графическими объектами, а StretchBlt переворачивает картинки простой сменой знаков. Могу предложить маленький кусочек, который всё, что рисуется в окне поворачивает на полрадиана, а картинку ещё и зеркально отражает вокруг одной из осей.

Код:
	case WM_PAINT:
		{
			HBRUSH		hbrOldBrush;
			INT			nOldBkMode;
			XFORM		xf;
			HDC			hMemDC;
			COLORREF	clrOld;
			float		rad_angle = -0.5;
			
			hdc = BeginPaint(hWnd, &ps);
			hMemDC = CreateCompatibleDC(hdc);
			
			SelectObject(hMemDC, hBmp);

			xf.eM11 = cos(rad_angle);
			xf.eM12 = sin(rad_angle);
			xf.eM21 = -xf.eM12;
			xf.eM22 = xf.eM11;
			xf.eDx = 200;
			xf.eDy = 200;

			SetGraphicsMode(hdc, GM_ADVANCED);
			SetWorldTransform(hdc, &xf);

			Rectangle(hdc, 0, 0, 300, 100);
			StretchBlt(hdc, 0, 100, 240, 360, hMemDC, 240, 0, -240, 360, SRCCOPY);

			nOldBkMode = SetBkMode(hdc, TRANSPARENT);
			clrOld = SetTextColor(hdc, 0);
			TabbedTextOut(hdc, 102,102,"Test\tText", 9, 0, NULL, 0);
			SetTextColor(hdc, RGB(255, 255, 63));
			TabbedTextOut(hdc, 100,100,"Test\tText", 9, 0, NULL, 0);
			SetTextColor(hdc, clrOld);
			SetBkMode(hdc, nOldBkMode);

			hbrOldBrush = (HBRUSH)SelectObject(hdc, GetSysColorBrush(COLOR_GRADIENTACTIVECAPTION));
			Ellipse(hdc, 0, 0, 300, 100);
			SelectObject(hdc, hbrOldBrush);

			DeleteDC(hMemDC);
			EndPaint(hWnd, &ps);
		}
B_N вне форума Ответить с цитированием
Старый 14.04.2008, 10:43   #6
Ins
Форумчанин
 
Регистрация: 29.12.2007
Сообщений: 137
По умолчанию

Windows поддерживает афинные преобразования координат, так что задача решается достаточно тривиально:
Код:
procedure DrawRotatedBitmap(Bitmap: TBitmap; Dest: TCanvas; X, Y: Integer;
  Angle: Single);
var
  Matrix: TXForm;
begin
  // Разрешаем афинные преобразования
  SetGraphicsMode(Dest.Handle, GM_ADVANCED);
  // Устанавливаем матрицу для смещения на (X, Y)
  Matrix.eM11 := 1;
  Matrix.eM12 := 0;
  Matrix.eM21 := 0;
  Matrix.eM22 := 1;
  Matrix.eDx := X;
  Matrix.eDy := Y;
  SetWorldTransform(Dest.Handle, Matrix);
  // Устанавливаем матрицу поворота
  Matrix.eM11 := Cos(Angle);
  Matrix.eM12 := Sin(Angle);
  Matrix.eM21 := -Sin(Angle);
  Matrix.eM22 := Cos(Angle);
  Matrix.eDx := 0;
  Matrix.eDy := 0;
  ModifyWorldTransform(Dest.Handle, Matrix, MWT_LEFTMULTIPLY);
  // Выводим изображение
  Dest.Draw(0, 0, Bitmap);
  // Восстанавливаем систему координат
  ModifyWorldTransform(Dest.Handle, Matrix, MWT_IDENTITY);
end;
Ins вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поворот за мышью??? Kostia Gamedev - cоздание игр: Unity, OpenGL, DirectX 34 29.06.2009 15:02
поворот bitmapa на n градусов DmT Общие вопросы C/C++ 1 01.08.2008 02:09
Поворот матрицы Cartman18 Помощь студентам 2 07.02.2008 11:11
timage, поворот ERASERROR Мультимедиа в Delphi 1 05.02.2008 12:10
Поворот картинки PAVEL315 Общие вопросы Delphi 3 24.12.2006 12:47