2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 BITMAP
Сообщение10.04.2010, 19:39 


23/12/08
245
Украина
Проблема вот в чем:
У меня есть HBITMAP, и мне нужно достать оттуда массив пикселей и пройтись по одним алгоритмом. Проблема в том, что я уже довольно сильно запутался в том как именно это делать, вроде есть и описание формата
и множество примеров где люди загружают а потом сохраняют картинку...
Но мне нужно всего-то пройтись по всем пикселям и скажем посчитать дисперсию для синего канала.

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

P.S Win32 C++ Api

 Профиль  
                  
 
 Re: BITMAP
Сообщение11.04.2010, 01:46 
Заслуженный участник


09/08/09
3438
С.Петербург
Когда-то делал так, как написано в этом посте: 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 


23/12/08
245
Украина
Спасибо это именно то что мне было нужно.

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

 Профиль  
                  
 
 Re: BITMAP
Сообщение11.04.2010, 13:13 
Заслуженный участник


11/05/08
32166
4 бита -- это только если формат с шестнадцатицветной палитрой. Чтоб не мучаться -- просто переведите его любым графическим редактором в беспалитренный 24-битовый, и уже с ним и работайте.

 Профиль  
                  
 
 Re: BITMAP
Сообщение11.04.2010, 13:25 


23/12/08
245
Украина
Используя GDI+ Bitmap, добился что итерация алгоритма 7 сек, а надо не больше 3-х.
Сейчас есть два варианта:
1) уменьшить разрешение картинка средствами того-же GDI (что точно поможет)
2) переписать под чистый win api, но тогда я не смогу использовать первый пункт.

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

 Профиль  
                  
 
 Re: BITMAP
Сообщение13.04.2010, 15:00 


04/02/08
325
Буково
Цитата:
Используя 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 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group