Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.222.23.119] |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Приветствую всех форумчан!!!
Подскажите пожалуйста рабочую функцию поворота BMP - файла на заданый угол... Нашла здесь, но чего то не получается скомпилить и заюзать функцию... Может кто из форумчан уже использовал в своих проектах функцию поворота, помогите пожалуйста... |
Сообщ.
#3
,
|
|
|
B.V. ну ты загнул я думала подкинул простенькую функцию, а тут параметров жуть... Я с такой не разберусь...
//Поворот изображения на произвольный угол //Формула: // 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, Угол поворота, Направление... |
Сообщ.
#4
,
|
|
|
Цитата Всё что надо DC, Угол поворота, Направление... Ну, еще надо центр, вокруг которого поворачивается BMP, размер и положение BMP на HDC Ну и заодно окно, которому принадлежит HDC Всё это есть в функции //Поворот изображения на произвольный угол //Формула: // 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) |
Сообщ.
#5
,
|
|
|
Цитата Hsilgos @ Ну, еще надо центр, вокруг которого поворачивается BMP, размер и положение BMP на HDC так весь рисунок надо повернуть... то есть центр - пересечение диагоналей |
Сообщ.
#6
,
|
|
|
Цитата так весь рисунок надо повернуть... то есть центр - пересечение диагоналей Это частный случай. Пусть есть координаты рисунка RECT imageRect; Координаты точки, вокруг которой будет поворачиваться рисунок: int lx = (imageRect.right - imageRect.left)/2; int ly = (imageRect.bottom - imageRect.top)/2; Остальные параметры понятны? |
Сообщ.
#7
,
|
|
|
Цитата Hsilgos @ Остальные параметры понятны? HWND hWndCallback - не понятно... И почему координаты типа LONG, а не INT? |
Сообщ.
#8
,
|
|
|
Цитата konfetka2 @ HWND hWndCallback - не понятно... Тебе этот параметр не нужен, передавай NULL. Цитата konfetka2 @ И почему координаты типа LONG, а не INT? А какая разница? Если для тебя это важно по каким-то религиозным соображениям - измени тип на int |
Сообщ.
#9
,
|
|
|
А ужастно боюсь типов в С++ их столько разных напридумывали, а ещё когда компилятор говорит что тип типа не правильный...
Препод говорит избегать определённых типов, вот и LONG... А при изменении с LONG на INT функцию нужно править? |
Сообщ.
#10
,
|
|
|
Студентка, значит... совершенно не знающая основ. Тогда тебе сюда: ПОМОЩЬ СТУДЕНТАМ
|
Сообщ.
#11
,
|
|
|
B.V. последний маленький вопросик... Я знаю что размер изображения можно поменять так:
Image * img = bmp->GetThumbnailImage(720, 540); скажи можно изменить размер BMP - файла без использования класса? Ну как твоей функцией... |
Сообщ.
#12
,
|
|
|
Цитата konfetka2 @ скажи можно изменить размер BMP - файла без использования класса? Без использования GDI+? Или без использования класса Image? |
Сообщ.
#13
,
|
|
|
Да правильно, без использования класса Image...
|
Сообщ.
#14
,
|
|
|
Graphics::DrawImage
|
Сообщ.
#15
,
|
|
|
Цитата B.V. @ Graphics::DrawImage Это конечно хорошо... Ну а можно подробнее... Добавлено Цитата konfetka2 @ Ой сорри уже сама нашла здесь... Цитата (B.V. @ Сегодня, 13:12) Graphics::DrawImage Это конечно хорошо... Ну а можно подробнее... Добавлено А вообше можно обойтись как нибудь без GDI+??? |