На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела Visual C++ / MFC / WTL (далее Раздела)
1) На Раздел распространяются все Правила Форума.
2) Перед тем, как создать новый топик, убедитесь, что Вы читали Правила создания тем в Разделе.
3) Вопросы, не связанные с программированием (настройки MS Visual Studio, книги, библиотеки и т.д.),
обсуждаются в разделе C/C++: Прочее
4) Вопросы разработки .NET (Windows Form, C++/CLI и т.п.) приложений на Visual C++/C# обсуждаются в разделе .NET.
5) Нарушение Правил может повлечь наказание со стороны модераторов.

Полезные ссылки:
user posted image FAQ Раздела user posted image Обновления для FAQ Раздела user posted image Поиск по Разделу user posted image MSDN Library Online
Модераторы: ElcnU
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> Поворот BMP - файла на произвольный угол , WinAPI
    Приветствую всех форумчан!!! :rolleyes:
    Подскажите пожалуйста рабочую функцию поворота BMP - файла на заданый угол...
    Нашла здесь, но чего то не получается скомпилить и заюзать функцию... Может кто из форумчан уже использовал в своих проектах функцию поворота, помогите пожалуйста...
        B.V. ну ты загнул :D я думала подкинул простенькую функцию, а тут параметров жуть... Я с такой не разберусь... :'(
        ExpandedWrap disabled
          //Поворот изображения на произвольный угол
          //Формула:
          //  x' = cos(rad) * (x - x0) +/- sin(rad) * (y - y0) + x0
          //  y' = cos(rad) * (y - y0) -/+ sin(rad) * (x - x0) + y0
          //Параметры:
          //  hDC             DC назначения
          //  lX              Центр поворота по оси X
          //  lY              Центр поворота по оси Y
          //  lAngle          Угол поворота
          //  lDirection      Направление (по часовой стрелке/против часовой стрелки)
          //  crBkColor       Цвет, который будет использоваться как цвет фона
          //  pRC             Указатель на структуру RECT, определяющую область изображения для изменения
          //Возвращаемое значение: TRUE в случае успеха, FALSE в случае ошибки
          BOOL Rotate(HDC hDC, LONG lX, LONG lY, LONG lAngle, LONG lDirection, COLORREF crBkColor, LPRECT pRC, HWND hWndCallback)
          {
              BITMAPINFO BMI = { 0 };
              HDC hTmpDC;
              HBITMAP hOldBitmap, hTmpBitmap;
              ULONG lBytesCnt;
              LPBYTE pPixels1, pPixels2;
              LONG i, j, x, y;
              double dblRad;
           
              volatile ONPROGRESSPARAMS ONPP = { 0 };
           
              USHORT BPP = GetDeviceCaps(hDC, BITSPIXEL);
           
              if ((BPP != 24) && (BPP != 32)) return FALSE;
              if (GetObjectType(hDC) != OBJ_DC) return FALSE;
           
              LONG W = GetDeviceCaps(hDC, HORZRES);
              LONG H = GetDeviceCaps(hDC, VERTRES);
           
              switch (BPP)
              {
                  case 24:
                      lBytesCnt = (((BPP / 8) * W + 3) / 4) * 4;
                      lBytesCnt += ((lBytesCnt * H + 3) / 4) * 4;
                      break;
                  case 32:
                      lBytesCnt = W * H * (BPP / 8);
                      break;
              }
           
              pPixels1 = new BYTE[lBytesCnt];
              pPixels2 = new BYTE[lBytesCnt];
           
              hTmpDC = CreateCompatibleDC(hDC);
              hTmpBitmap = CreateCompatibleBitmap(hDC, W, H);
              hOldBitmap = (HBITMAP)SelectObject(hTmpDC, hTmpBitmap);
              BitBlt(hTmpDC, 0, 0, W, H, hDC, 0, 0, SRCCOPY);
           
              BMI.bmiHeader.biSize = sizeof(BMI.bmiHeader);
              BMI.bmiHeader.biWidth = W;
              BMI.bmiHeader.biHeight = H;
              BMI.bmiHeader.biPlanes = 1;
              BMI.bmiHeader.biBitCount = BPP;
              BMI.bmiHeader.biCompression = BI_RGB;
              GetDIBits(hTmpDC, hTmpBitmap, 0, H, pPixels1, &BMI, DIB_RGB_COLORS);
              GetDIBits(hTmpDC, hTmpBitmap, 0, H, pPixels2, &BMI, DIB_RGB_COLORS);
           
              dblRad = (double)(lAngle * (3.14159265358979 / 180));
           
              lX += pRC->left;
              lY += pRC->top;
           
              ReverseBytes((LPBYTE)&crBkColor, 3);
           
              for (j = pRC->top; j < pRC->bottom; j++)
              {
                  for (i = pRC->left; i < pRC->right; i++)
                  {
                      SetPixel(pPixels1, &BMI, i, j, crBkColor);
                  }
              }
           
              for (j = pRC->top; j < pRC->bottom; j++)
              {
                  for (i = pRC->left; i < pRC->right; i++)
                  {
                      switch (lDirection)
                      {
                          case ROTATE_DIRECTION_CW:
                              x = (LONG)(cos(dblRad) * (i - lX) + sin(dblRad) * (j - lY) + lX);
                              y = (LONG)(cos(dblRad) * (j - lY) - sin(dblRad) * (i - lX) + lY);
                              break;
                          case ROTATE_DIRECTION_CCW:
                              x = (LONG)(cos(dblRad) * (i - lX) - sin(dblRad) * (j - lY) + lX);
                              y = (LONG)(cos(dblRad) * (j - lY) + sin(dblRad) * (i - lX) + lY);
                              break;
                          default:
                              //
                              break;
                      }
           
                      if ((x < pRC->left) || (x > (pRC->right - 1))) continue;
                      if ((y < pRC->top) || (y > (pRC->bottom - 1))) continue;
           
                      SetPixel(pPixels1, &BMI, i, j, GetPixel(pPixels2, &BMI, x, y));
                  }
                  if (hWndCallback)
                  {
                      ONPP.dwPercents = (DWORD)(((double)j / (double)pRC->bottom) * 100);
                      SendMessage(hWndCallback, WM_GRAPHICSEVENT, MAKEWPARAM(EVENT_ON_PROGRESS, 0),
                          (LPARAM)&ONPP);
                  }
              }
           
              StretchDIBits(hDC, 0, 0, W, H, 0, 0, W, H, pPixels1, &BMI,
                  DIB_RGB_COLORS, SRCCOPY);
           
              SelectObject(hTmpDC, hOldBitmap);
              DeleteObject(hTmpBitmap);
              DeleteDC(hTmpDC);
              delete[] pPixels1;
              delete[] pPixels2;
              return TRUE;
          }

        Есть какая - нибудь простая функция, типа BOOL Rotate(HDC hDC, LONG lAngle, LONG lDirection)
        Всё что надо DC, Угол поворота, Направление...
          Цитата
          Всё что надо DC, Угол поворота, Направление...

          Ну, еще надо центр, вокруг которого поворачивается BMP, размер и положение BMP на HDC
          Ну и заодно окно, которому принадлежит HDC
          Всё это есть в функции

          ExpandedWrap disabled
            //Поворот изображения на произвольный угол
            //Формула:
            //  x' = cos(rad) * (x - x0) +/- sin(rad) * (y - y0) + x0
            //  y' = cos(rad) * (y - y0) -/+ sin(rad) * (x - x0) + y0
            //Параметры:
            //  hDC             DC назначения
            //  lX              Центр поворота по оси X
            //  lY              Центр поворота по оси Y
            //  lAngle          Угол поворота
            //  lDirection      Направление (по часовой стрелке/против часовой стрелки)
            //  crBkColor       Цвет, который будет использоваться как цвет фона
            //  pRC             Указатель на структуру RECT, определяющую область изображения для изменения
            //Возвращаемое значение: TRUE в случае успеха, FALSE в случае ошибки
            BOOL Rotate(HDC hDC, LONG lX, LONG lY, LONG lAngle, LONG lDirection, COLORREF crBkColor, LPRECT pRC, HWND hWndCallback)
            Цитата Hsilgos @
            Ну, еще надо центр, вокруг которого поворачивается BMP, размер и положение BMP на HDC

            так весь рисунок надо повернуть... то есть центр - пересечение диагоналей :)
              Цитата
              так весь рисунок надо повернуть... то есть центр - пересечение диагоналей

              Это частный случай.
              Пусть есть координаты рисунка
              ExpandedWrap disabled
                RECT imageRect;

              Координаты точки, вокруг которой будет поворачиваться рисунок:
              ExpandedWrap disabled
                int lx = (imageRect.right - imageRect.left)/2;
                int ly = (imageRect.bottom - imageRect.top)/2;

              Остальные параметры понятны?
                Цитата Hsilgos @
                Остальные параметры понятны?

                HWND hWndCallback - не понятно...
                И почему координаты типа LONG, а не INT?
                  Цитата konfetka2 @
                  HWND hWndCallback - не понятно...


                  Тебе этот параметр не нужен, передавай NULL.

                  Цитата konfetka2 @
                  И почему координаты типа LONG, а не INT?


                  А какая разница? Если для тебя это важно по каким-то религиозным соображениям - измени тип на int :)
                    А ужастно боюсь типов в С++ их столько разных напридумывали, а ещё когда компилятор говорит что тип типа не правильный...
                    Препод говорит избегать определённых типов, вот и LONG...
                    А при изменении с LONG на INT функцию нужно править?
                      Студентка, значит... совершенно не знающая основ. Тогда тебе сюда: ПОМОЩЬ СТУДЕНТАМ
                        B.V. последний маленький вопросик... Я знаю что размер изображения можно поменять так:
                        ExpandedWrap disabled
                          Image * img = bmp->GetThumbnailImage(720, 540);

                        скажи можно изменить размер BMP - файла без использования класса?
                        Ну как твоей функцией...
                          Цитата konfetka2 @
                          скажи можно изменить размер BMP - файла без использования класса?


                          Без использования GDI+? Или без использования класса Image?
                            Да правильно, без использования класса Image...
                              Graphics::DrawImage
                                Цитата B.V. @
                                Graphics::DrawImage

                                Это конечно хорошо... Ну а можно подробнее...

                                Добавлено
                                Цитата konfetka2 @
                                Цитата (B.V. @ Сегодня, 13:12)
                                Graphics::DrawImage

                                Это конечно хорошо... Ну а можно подробнее...
                                Ой сорри уже сама нашла здесь...

                                Добавлено
                                А вообше можно обойтись как нибудь без GDI+???
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0379 ]   [ 16 queries used ]   [ Generated: 20.04.24, 14:25 GMT ]