Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > транспонирование изображения


Автор: susanin 16.2.2007, 23:00
нужен код, для транспонирования изображения.... точнее он есть вот такой....
Код

Processing->ShortCut;
  int J,JH,I,IH,mr,mg,mb;

  IH=Image1->Picture->Bitmap->Height;
  JH=Image1->Picture->Bitmap->Width;
  Image2->Picture->Bitmap->Width=JH;
  Image2->Picture->Bitmap->Height=IH;

     for(I =0; I <IH; I++)
     for(J = 0; J <JH; J++){
     //Попиксельное чтение
     mr=GetRValue(Image1->Canvas->Pixels[J][I]);
     mg=GetGValue(Image1->Canvas->Pixels[J][I]);
     mb=GetBValue(Image1->Canvas->Pixels[J][I]);
     // Преобразование
     //Ограничение динамического диапазона
     if (mr>289) mr=0;  else mr=mg;
     if (mr<0)   mr=289;    else mr=mg;
     if (mg>289) mg=0;  else mg=mg;
     if (mg<0)   mg=289;    else mg=mg;
     if (mb>289) mb=289;  else mb=mb;
     if (mb<0)   mb=0;    else mb=mb;

     Image2->Picture->Bitmap->Canvas->Pixels[I][J] = RGB(mr, mg, mb);

но этот код поворачивает картинку на 90 градусов влево...хотелось бы еще , чтобы она как то вправо поворачивалась.....помогите написать похожий код, только с поворотом направо

Автор: Akeem 16.2.2007, 23:26
вот алгоритм поворота для любой картинки.

пусть у нас есть картинка с размерами по горизонтали X и по вертикали Y.
Картинку поворачивать самое проще с помощью последовательных скосов.

типа :
 _____               _______
|          |            /            /
|          |   =>   /            / 
|_____|         /______/

Любой поворот описывается 3-мя скосами вот системы.

x1 = X +y1*d1
y1 = Y

y2 = y1 +x1*d2
x2=x1

x3 = x2+y2*d3
y3 = y2

x3 = X*cos(Alpha) - Y*sin(Alpha)
y3 = X*sin(Alpha) + Y*cos(Alpha)

неизвестные параметры d1, d2,d3 легко находятся подстановкой

d2 = sin(alaha)
d3 = d1 = (cos(alpha-1)/sin(alpha)

----------------------------------------------------------------------------------------------------

Один только минус этого сдвига, то что мы должны сдвигать на целое количество пикселей.

Твоя процедура поворота в лево хороша, но сильно ресурсоемкая. Моя же позволяет поворачивать изображение на любой заданный угол.  в право это пи/2, а в лево -пи/2

ЗЫ я думаю ты сможешь запрограммировать алгоритм. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)