Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Последние темы форума

Показать новые сообщения »

Почтовая рассылка

Подписчиков: 11656
Последний выпуск: 19.06.2015

Поворот битмапа на любой угол без использования GetPixel/SetPixel

Автор: Yves Maurer
Орининал: 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 - отступы исходной картинки внутри квадрата вращения.

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 

Комментарии

1.
Аноним
Мне нравитсяМне не нравится
26 января 2006, 18:03:00
Огромное спасибо! Знал ведь что смогу найти на этом сайте =) Вот и нашел! Опять же, СПАСИБО!
2.
Аноним
Мне нравитсяМне не нравится
20 декабря 2005, 23:00:26
отличный сэмпл. спасибо. искал быстрый алгоритм поворота изображения. =)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог