Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поворот изображения 
:(
    Опции темы
Dmi3ev
Дата 15.6.2009, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: 16
Всего: 41



Нужно поворачивать Bitmap на 90, на 180, и на 270 градусов
это можно программно, примерно вот так
http://www.cyberforum.ru/cpp-builder/thread29785.html
а можно просто сделать сразу четыре файла с изображением и грузить нужный...
как правильнее??? как быстрее будет работать???


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

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


Новичок



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

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



Приблизительно так:
Bitmap - в  Image1. При каждом выполнении Rotate() выполняется поворот на 90 за часовой.

Код

#include <algorithm>
#include <math.h>
using namespace std;

void __fastcall TForm1::Rotate(void)
{
//поворот
    Graphics::TBitmap* BitmapOriginal;
    Graphics::TBitmap* BitmapRotated;
    int i, iRotationAxis, iOriginal, iPrime, iPrimeRotated;
    int j, jRotationAxis, jOriginal, jPrime, jPrimeRotated,max_p;
    bool Fv;
    double Theta, cosTheta, sinTheta;
    RGBTRIPLE* RowOriginal, *RowRotated;
    BitmapOriginal = new Graphics::TBitmap;
    BitmapRotated = new Graphics::TBitmap;
 BitmapOriginal->Assign(Image1->Picture->Graphic);
//==================
    if (BitmapOriginal->PixelFormat != pf24bit)
    {BitmapOriginal->PixelFormat = pf24bit;}
    BitmapRotated->PixelFormat = pf24bit;

    BitmapRotated->Width = BitmapOriginal->Height;
    BitmapRotated->Height = BitmapOriginal->Width;

    if (BitmapOriginal->Height>BitmapOriginal->Width)
    {
    //верт
    max_p = max(BitmapRotated->Width, BitmapRotated->Height);
    iRotationAxis = max_p/2;
    jRotationAxis = max_p/2;
    }
    else
    {
    //гор
    max_p = min(BitmapRotated->Width, BitmapRotated->Height);
    iRotationAxis = max_p/2;
    jRotationAxis = max_p/2;
    }

    Theta = -(90 + 0/100 ) * M_PI/180;
    sinTheta = sin(Theta);
    cosTheta = cos(Theta);

    for ( j = BitmapRotated->Height-1; j >= 0 ;  j--)
    {
        RowRotated = (RGBTRIPLE*)BitmapRotated->ScanLine[j];
        jPrime = 2 * (j - jRotationAxis) + 1;
        for ( i = BitmapRotated->Width-1; i >= 0; i--)
        {
            iPrime = 2 * (i - iRotationAxis) + 1;
            iPrimeRotated = int(iPrime * cosTheta - jPrime * sinTheta);
            jPrimeRotated = int(iPrime * sinTheta + jPrime * cosTheta);
            iOriginal = (iPrimeRotated - 1)/2 + iRotationAxis;
            jOriginal = (jPrimeRotated - 1)/2 + jRotationAxis;

            if ( (iOriginal >= 0) && (iOriginal <= BitmapOriginal->Width-1) && (jOriginal >= 0) && (jOriginal <= BitmapOriginal->Height-1) )
            {
                RowOriginal = (RGBTRIPLE*)BitmapOriginal->ScanLine[jOriginal];
                RowRotated[i] = RowOriginal[iOriginal];
            }
            else
            {
                RowRotated[i].rgbtBlue  = 255;
                RowRotated[i].rgbtGreen = 0;
                RowRotated[i].rgbtRed   = 0;
            }
        }
    }
//===============
Image1->Picture->Assign(BitmapRotated);
//--------------------
BitmapRotated->Free();
{BitmapOriginal->Free();
}
//---------------------------------------------------------------------------

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


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



А синусы/косинусы от (0,90,180,360) вычисляются что бы скучно не было?  smile 
PM MAIL   Вверх
Dmi3ev
Дата 16.6.2009, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: 16
Всего: 41



xvr, а если серьезно??? может лучше грузить из файла каждый раз (ведь всего четыре положения)??? быстрее будет ведь???
размер изображения 40х40
я пока так и делаю... мне кажется быстрее грузануть нужную картинку, чем вот такой финт проделать...
gem, по ссылке примерно то же самое...
у меня вопрос, не как повернуть, а как правильно это сделать???


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

PM MAIL   Вверх
xvr
Дата 16.6.2009, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Если картинки фиксированные (тем более с размером 40х40), то проще сделать сразу все с нужными углами поворотов, загнать их в ImageList и не мучится.
Если же картинки откуда то берутся, то можно вращать, но лучше это сделать 1 раз (например при старте программы), а потом использовать готовые.

PM MAIL   Вверх
Dmi3ev
Дата 16.6.2009, 23:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: 16
Всего: 41



Цитата

Если картинки фиксированные (тем более с размером 40х40), то проще сделать сразу все с нужными углами поворотов, загнать их в ImageList и не мучится.

именно фиксированные, именно с размером 40х40.
следовательно, беру этот вариант!!!


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

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

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

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

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


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

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


 




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


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

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