Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Поворот изображения

2.1K
04 декабря 2002 года
kimN
5 / / 04.12.2002
Сложная задачка- наверное не для форума.:(
Вращение графического образа:
1.на 90/360 градусов в лубую сторону
2.произвольное вращение
3.отображние зеркальное в H и W проекции.
4.перспективное изменение
примерно так: kolba11.narod.ru/rotate.html
:sad: :sad: :sad: Помогите , плизз!
429
04 декабря 2002 года
Slon
78 / / 20.01.2000
Цитата:
Originally posted by kimN
Сложная задачка- наверное не для форума.:(
Вращение графического образа:
1.на 90/360 градусов в лубую сторону
2.произвольное вращение
3.отображние зеркальное в H и W проекции.
4.перспективное изменение
примерно так: kolba11.narod.ru/rotate.html
:sad: :sad: :sad: Помогите , плизз!



>Сложная задачка- наверное не для форума.:(
Да брось ты...:)
>3.отображние зеркальное в H и W проекции.
По горизонтали:
Image1->Canvas->CopyRect(Rect(-1, -1, Image1->Width, Image1->Height), Image1->Canvas, Rect(Image1->Width, -1, -1, Image1->Height));
По вертикали:
Image1->Canvas->CopyRect(Rect(-1, -1, Image1->Width, Image1->Height),
Image1->Canvas, Rect(-1, Image1->Height, Image1->Width, -1));

>1.на 90/360 градусов в лубую сторону
Я подумаю.

429
04 декабря 2002 года
Slon
78 / / 20.01.2000
Координыты ставил -1 вместо нуля. Так вроде бы не появлялась лишняя белая полоска в 1 пиксель толшиной. А сейчас снова есть. Не знаю от чего зависит.

Теперь повороты:
=====================
Graphics::TBitmap *bmp1 = new Graphics::TBitmap;
Graphics::TBitmap *bmp2 = new Graphics::TBitmap;
bmp1->LoadFromFile("a.bmp");
bmp2->Width = bmp1->Height;
bmp2->Height = bmp1->Width;

//оригинал
Canvas->Draw(0, 0, bmp1);

//90 град
for(int y=bmp2->Height; y>=0; y--)
for(int x=0; x<=bmp2->Width; x++)
bmp2->Canvas->Pixels[x][y] = bmp1->Canvas->Pixels[y][bmp1->Height-x-1];

Canvas->Draw(bmp1->Width + 10, 0, bmp2);

//270 град
for(int y=bmp2->Height; y>=0; y--)
for(int x=0; x<=bmp2->Width; x++)
bmp2->Canvas->Pixels[x][y] = bmp1->Canvas->Pixels[bmp1->Width-y-1][x];

Canvas->Draw(0, bmp1->Height + 10, bmp2);

//180 град
bmp2->Width = bmp1->Width;
bmp2->Height = bmp1->Height;
bmp2->Canvas->CopyRect(Rect(0, 0, bmp1->Width, bmp1->Height), bmp1->Canvas,Rect(bmp1->Width, bmp1->Height, 0, 0));


Canvas->Draw(bmp1->Width + 10, bmp1->Width + 10, bmp2);

delete bmp1;
delete bmp2;
=====================
Конечно медленно, т.к. в первых трех случаях обрабатывается попиксельно. Наверное можно как-то оптимизировать.
429
04 декабря 2002 года
Slon
78 / / 20.01.2000
>2.произвольное вращение
Поворачивает изображение, срезая углы.

bool cancel = false;
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int x, y;
float xo, yo;
Extended r, a, s, c;
Graphics::TBitmap *bmp1 = new Graphics::TBitmap();
Graphics::TBitmap * bmp2 = new Graphics::TBitmap();
bmp1->LoadFromFile("a.bmp");
xo = bmp1->Width / 2;
yo = bmp1->Height / 2;
bmp2 = new Graphics::TBitmap;
bmp2->Width = bmp1->Width;
bmp2->Height = bmp1->Height;
a = 0;
do{
for( y = 0; y < bmp1->Height; y++ )
{
for( x = 0; x < bmp1->Width; x++ )
{
r = sqrt( pow( x - xo, 2.0 ) + pow( y - yo, 2.0 ) );
SinCos( a + ArcTan2( ( y - yo ), ( x - xo ) ), s, c );
bmp2->Canvas->Pixels[ x ][ y ] =
bmp1->Canvas->Pixels[ ( xo + r * c ) ][ ( yo + r * s ) ];
}
Application->ProcessMessages();
}
Form1->Canvas->Draw(xo, yo, bmp2);
a += 0.1;
Application->ProcessMessages();
}
while(!cancel);

delete bmp1;
delete bmp2;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
cancel = true;
}
//---------------------------------------------------------------------------

>4.перспективное изменение
Если придется загружать изображение в 2-мерный массив, используй ScanLine.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог