Поворот битмапа на любой угол без использования GetPixel/SetPixel
Автор: Yves Maurer
Среда разработки: 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 - отступы исходной
картинки внутри квадрата вращения.
Downloads
Скачать демонстрашку - 25 Kb
Скачать исходник - 10 Kb
|