Поворот битмапа на любой угол без использования GetPixel/SetPixel
Автор: Yves Maurer
Орининал: www.исходники.ру
Орининал: www.исходники.ру
Среда разработки: Windows GDI / Win32 API
Использование GetDIBits
Приведённый в этой статье код использует GetDIBits, поэтому работает довольно быстро, так как использует 32-битное представление битмапа. Все операции производятся в локальной памяти в отличие от медленных вызовов API функций GetPixel и BitBlt.
pBGR MyGetDibBits(HDC hdcSrc, HBITMAP hBmpSrc, int nx, int ny) { BITMAPINFO bi; BOOL bRes; pBGR buf; bi.bmiHeader.biSize = sizeof(bi.bmiHeader); bi.bmiHeader.biWidth = nx; bi.bmiHeader.biHeight = - ny; bi.bmiHeader.biPlanes = 1; bi.bmiHeader.biBitCount = 32; bi.bmiHeader.biCompression = BI_RGB; bi.bmiHeader.biSizeImage = nx * 4 * ny; bi.bmiHeader.biClrUsed = 0; bi.bmiHeader.biClrImportant = 0; buf = (pBGR) malloc(nx * 4 * ny); bRes = GetDIBits(hdcSrc, hBmpSrc, 0, ny, buf, &bi, DIB_RGB_COLORS); if (!bRes) { free(buf); buf = 0; } return buf; }
RotateMemoryDC
В этой функции делается вся основная работа. В функции использованы следующие формулы:
orgX = (cA * (((float) stepX + OfX) + CtX * (cA - 1)) + sA * (((float) stepY + OfY) + CtY * (sA - 1))) / cA*cA + sA*sA; orgY = CtY + (CtX - ((float) stepX + OfX)) * sA + cA *(((float) stepY + OfY) - CtY + (CtY - CtX) * sA);
cA это cos(угла), а sA это sin(угла). CtX и CtY - центр исходного изображения, а OfX и OfY - отступы исходной картинки внутри квадрата вращения.
Оставить комментарий
Комментарии
1.
26 января 2006, 18:03:00
Огромное спасибо! Знал ведь что смогу найти на этом сайте =) Вот и нашел! Опять же, СПАСИБО!
2.
20 декабря 2005, 23:00:26
отличный сэмпл. спасибо. искал быстрый алгоритм поворота изображения. =)