2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 BITMAP
Сообщение10.04.2010, 19:39 
Проблема вот в чем:
У меня есть HBITMAP, и мне нужно достать оттуда массив пикселей и пройтись по одним алгоритмом. Проблема в том, что я уже довольно сильно запутался в том как именно это делать, вроде есть и описание формата
и множество примеров где люди загружают а потом сохраняют картинку...
Но мне нужно всего-то пройтись по всем пикселям и скажем посчитать дисперсию для синего канала.

Может кто-нибудь напишет маленький кусочек кода, а то я уже запутался что и в какой последовательности нужно делать.

P.S Win32 C++ Api

 
 
 
 Re: BITMAP
Сообщение11.04.2010, 01:46 
Когда-то делал так, как написано в этом посте: http://www.rsdn.ru/forum/winapi/11034.1.aspx
код: [ скачать ] [ спрятать ]
Используется синтаксис C++
BITMAPINFOHEADER bmiHeader;
memset(&bmiHeader, 0, sizeof(bmiHeader));

bmiHeader.biSize = sizeof(bmiHeader);
bmiHeader.biWidth = nWidth;
bmiHeader.biHeight = nHeight;
bmiHeader.biPlanes = 1;
bmiHeader.biBitCount = 24;
bmiHeader.biCompression = BI_RGB;

// поскольку мы оставили поле biClrUsed нулем, то структура
// BITMAPINFO целиком нам, в общем-то, не нужна, поскольку
// таблица цветов не используется. Будет достаточно одного
// заголовка

// рассчитываем размер буфера для изображения с учетом того,
// что строки должны быть выравнены на sizeof(DWORD)
DWORD cbLine = (nWidth * 3 + (sizeof(DWORD) - 1)) & ~(sizeof(DWORD) - 1);
DWORD cbImage = cbLine * nHeight;

// выделяем память для буфера, в который будут помещены данные
// изображения
PVOID pBits = malloc(cbImage);
if (pBits == NULL) // TODO:

HDC hDC = GetDC(NULL);  // любой контекст устройства подойдет

// вызываем GetDIBits
if (!GetDIBits(hDC, hBitmap, 0, nHeight, pBits,
               (BITMAPINFO *)&bmiHeader, DIB_RGB_COLORS))
    // TODO:

ReleaseDC(NULL, hDC);
 

В результате выполнения GetDIBits в буфер pBits копируется содержимое битмапа строка за строкой по 3 байта на пиксель. Строки развертки выравниваются на границу двойного слова.

Ну а если время выполнения не очень поджимает, то можно и GetPixel попользовать :)

 
 
 
 Re: BITMAP
Сообщение11.04.2010, 12:53 
Спасибо это именно то что мне было нужно.

P.S. там вроде везде пишут что на пиксель 4 бита (еще один бит статуса, я так понял для меньшей фрагментации).

 
 
 
 Re: BITMAP
Сообщение11.04.2010, 13:13 
4 бита -- это только если формат с шестнадцатицветной палитрой. Чтоб не мучаться -- просто переведите его любым графическим редактором в беспалитренный 24-битовый, и уже с ним и работайте.

 
 
 
 Re: BITMAP
Сообщение11.04.2010, 13:25 
Используя GDI+ Bitmap, добился что итерация алгоритма 7 сек, а надо не больше 3-х.
Сейчас есть два варианта:
1) уменьшить разрешение картинка средствами того-же GDI (что точно поможет)
2) переписать под чистый win api, но тогда я не смогу использовать первый пункт.

Наверно попробую сначала второй вариант, он попроще.

 
 
 
 Re: BITMAP
Сообщение13.04.2010, 15:00 
Цитата:
Используя GDI+ Bitmap, добился что итерация алгоритма 7 сек, а надо не больше 3-х.

Как-то неправильно вы дисперсию считаете. У меня цветная картинка 800х600 в wav-файл за 5 секунд перегоняется:
Код:
time ./a.out img.bmp sample.wav 44100 2
Input file: img.bmp
Output file: sample.wav
File size: 1440054 bytes
Offset to image data is 54 bytes
Image size = 800 x 600
Number of colour planes is 1
Bits per pixel is 24
Compression type is 0
Number of colours is 0
Number of required colours is 0
Creating 16bit WAV with 2 channels and 44100Hz.
0.57user 4.62system 0:05.20elapsed 99%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+3752outputs (0major+247minor)pagefaults 0swaps

 
 
 [ Сообщений: 6 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group