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


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

Автор: gem 16.6.2009, 08:51
Приблизительно так:
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();
}
//---------------------------------------------------------------------------

Автор: xvr 16.6.2009, 14:02
А синусы/косинусы от (0,90,180,360) вычисляются что бы скучно не было?  smile 

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

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

Автор: Dmi3ev 16.6.2009, 23:55
Цитата

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

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

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