Использование 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 - отступы исходной картинки внутри квадрата вращения. |