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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.10.2011, 19:48   #1
DEamON_M
 
Аватар для DEamON_M
 
Регистрация: 28.10.2011
Сообщений: 7
По умолчанию Проблема с поворотом изображения в Image

Имеется программа просмотра изображений, но никак не получается сделать поворот изображений на 90 градусов по и против часовой стрелки. На этом же форуме нашёл функцию и поделал её по себя.
Код:
var B:TBitMap;
Procedure TGlav.ImagePov;
var M:TXFORM;
    a:Double;
    HDC:THandle;
begin
     B:=TBitMap.Create;
     B.Assign(Image1.Picture.Bitmap);
     hDc:=image1.Canvas.Handle;
     SetGraphicsMode(hDc, GM_ADVANCED);
     M.eM11:=1;
     M.eM12:=0;
     M.eM21:=0;
     M.eM22:=1;
     M.eDx:=-B.Width div 2;
     M.eDy:=-B.Height div 2;
     SetWorldTransform(hDc, M);
     a:=PI/6;
     fillChar(M, sizeOf(M), 0);
     M.eM11:=Cos(a);
     M.eM12:=Sin(a);
     M.eM21:=-Sin(a);
     M.eM22:=Cos(a);
     M.eDx:=0;
     M.eDy:=0;
     ModifyWorldTransform(hDc, M, MWT_RIGHTMULTIPLY);
     M.eM11:=1;
     M.eM12:=0;
     M.eM21:=0;
     M.eM22:=1;
     M.eDx:=B.Width div 2;
     M.eDy:=B.Height div 2;
     ModifyWorldTransform(hDc, M, MWT_RIGHTMULTIPLY);
     Image1.Canvas.Draw(0, 0, b);
     B.Free;
end;
По идее всё должно работать, но в итоге после я получаю чёрный квадрат, который даже по размерам непохож на изначальное изображение.
Подскажите, кто знает, в чём проблема, как сделать поворот против часовой стрелки или предложите другой способ поворота.

P. S. Изображения не поворачиваются любого формата.
DEamON_M вне форума Ответить с цитированием
Старый 28.10.2011, 22:05   #2
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Попробуйте вот это.
Поворот изображения на N градусов

Поворот проще всего осуществляется в полярных кординатах, а у нас доступны только Декартовы. Перевод из осуществляется по формулам:

x=LCos(@) L=Sqrt(x**2+y**2)
y=LSin(@) @=arctg(y/x)

Для поворота достаточно добавить к a угол на который осуществляется поворот. И новые координаты будут выглядеть так:

x'=LCos(@+t)
y'=LSin(@+t)

В принципе это все. Давайте теперь напишем функцию которая будет переводить координаты из старых в новые.
Код:
procedure NewCoord(Var X, Y : Integer; Alpha : Double);
Var
A, L:   Double;
Begin
// Вычисляем размер плеча
L:= Sqrt(X*X+Y*Y);
// Вычисляем угол поворота, но если X = 0, то на него делить нельзя поэтому запишем угол равный PI/2
IF X = 0 THEN
IF Y  < 0 THEN
A:= -PI/2
ELSE
A:= PI/2
ELSE
A:= ArcTan(Y/X);
// Скорректируем значение угла (если X < 0, то угол должен лежать PI/2 до 3PI/2)
IF X < 0 THEN
A:= A+PI;
// Вычисляем новые координаты
X:= Round(L*(Cos(A+Alpha)));
Y:= Round(L*(Sin(A+Alpha)));
End;
Единственный "нехороший" момент - это вычисление угла. Функция ArcTan возвращает значение в диапазоне -PI/2 до PI/2. Мы должны сами корректировать это значение в зависимости от аргументов.
Теперь, когда есть функция, напишем саму процедуру поворота.
Нам понадобятся 2 объекта TImage, поле для ввода угла поворота и кнопочка по которой будет осуществляться поворот.
Загрузим в первый объект TImage картинку в формате bmp. А в обработчике события кнопки будем писать саму процедуру.
Код:
Var
N   :   Double;
I, J:   Integer;
XMax, YMax: Integer;
Max :   Integer;
X, Y:   Integer;
Xm, Ym, Xx, Yx: Integer;
L, A: Double;
begin
//Для начала преобразуем наш угол поворота в радианы
N:= -StrToFloat(Edit1.Text)*PI/180;
//Причем угол имеет обратное значение *
// Узнаем максимальные размеры изображения
XMax:= Image1.Width-1;
YMax:= Image1.Height-1;
// Получим координаты середины изображения (именно вокруг него мы и будем вращать)
X2:= XMax DIV 2;
Y2:= YMax DIV 2;
//Размеры будущего изображения
Xm:= 0; Xx:= 0; Ym:= 0; Yx:= 0;
//Определяем размер получаемого изображения
//левый верхний угол
X:= -X2; Y:= -Y2;
NewCoord(X, Y, -N);
X:= X+X2; Y:= Y+Y2;
IF X < Xm THEN
Xm:= X;
IF X > Xx THEN
Xx:= X;
IF Y < Ym THEN
Ym:= Y;
IF Y > Yx THEN
Yx:= Y;
//правый верхний угол
X:= X2; Y:= -Y2;
NewCoord(X, Y, -N);
X:= X+X2; Y:= Y+Y2;
IF X < Xm THEN
Xm:= X;
IF X > Xx THEN
Xx:= X;
IF Y < Ym THEN
Ym:= Y;
IF Y > Yx THEN
Yx:= Y;
//правый нижний угол
X:= X2; Y:= Y2;
NewCoord(X, Y, -N);
X:= X+X2; Y:= Y+Y2;
IF X < Xm THEN
Xm:= X;
IF X > Xx THEN
Xx:= X;
IF Y < Ym THEN
Ym:= Y;
IF Y > Yx THEN
Yx:= Y;
//левый нижний угол
X:= -X2; Y:= Y2;
NewCoord(X, Y, -N);
X:= X+X2; Y:= Y+Y2;
IF X < Xm THEN
Xm:= X;
IF X > Xx THEN
Xx:= X;
IF Y < Ym THEN
Ym:= Y;
IF Y > Yx THEN
Yx:= Y;
//Теперь мы знаем размеры изображения которое будет
Image2.Width:= Xx-Xm;
Image2.Height:= Yx-Ym;
//Идем по координатам полученной картинки и вычисляем для них координаты исходного изображения
FOR I:= Xm TO Xx DO 
FOR J:= Ym TO Yx DO Begin
//Получаем координаты точки изображения относительно его центра
X:= I-X2;
Y:= J-Y2;
//Преобразовываем
NewCoord(X, Y, N);
//Переходим к абсолютным координатам
X:= X+X2; Y:= Y+Y2;
//Если координаты точки не попадают в исходное изображение, то рисуем простую белую точку
IF (X > Image1.Width-1) OR (Y > Image1.Height-1) OR (X < 0) OR (Y < 0) THEN
Image2.Canvas.Pixels[I-Xm, J-Ym]:= clWhite
ELSE // иначе переносим точку с изображения оригинала
Image2.Canvas.Pixels[I-Xm, J-Ym]:= Image1.Canvas.Pixels[X, Y];
End;
//Все поворот завершен
End;
* Нам необходимо, чтобы каждая точка нового изображения соответствовала точка из старого изображения. Поэтому мы, грубо говоря, осуществляем поворот нового изображения на угол -N. Получая соответствующую координату, мы получим точку исходного изображения.
mihali4 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сохранение изображения из канвы image. koshel Мультимедиа в Delphi 4 08.05.2010 13:31
Большие изображения в Image Jene4ka Помощь студентам 7 16.03.2010 13:12
Проблема с загрузкой изображения в Image artemavd Общие вопросы Delphi 6 26.02.2010 20:40
Изменения размера изображения в Image BredoZavR Мультимедиа в Delphi 0 02.07.2009 13:30
Сохранение изображения с Image brutos Мультимедиа в Delphi 7 19.05.2009 12:26