Поворот битмапа на любой угол без использования 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; cA это cos(угла), а sA это sin(угла). CtX и CtY - центр исходного изображения, а OfX и OfY - отступы исходной картинки внутри квадрата вращения. DownloadsСкачать демонстрашку - 25 Kb
|