Официальный сайт студ.городка НГТУ
Программирование и БД » [Visual C++] как считать инфу с изображения? 

#1  04.11.08 22:52

[Visual C++] как считать инфу с изображения?

исходный файл: черно-белое изображение в .bmp формате...256*256..

должно получиться: матрица 256*256, состоящая из числовых значений каждого пиксела изображения...

как это можно реализовать?



в маткаде все это делается одной функцией READBMP....а вот в Си не получается так сделать%) помогите плз..

Offline

#2  04.11.08 23:31

Re: [Visual C++] как считать инфу с изображения?

У bmp-шки вроде бы вначале заголовок, а дальше всё в одном формате (r,g,b) (каждый беззнаковый однобайтовый). Надо уточнить как выглядит заголовок и пропустить его, а потом считывать числа прямым доступом к файлу.

Вот например, такой заголовок для файла 640х480 (не знаю, какие еще там данные в заголовке, но разрешение точно есть)

0x42, 0x4D, 0x38, 0x10, 0x0E, 0x00, 0x00, 0x00,
0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x28, 0x00,
0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0xE0, 0x01,
0x00, 0x00, 0x01, 0x00, 0x18, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x0B,
0x00, 0x00, 0x12, 0x0B, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00

Если у заголовка всегда такой фиксированный размер, то можно столько же пропустить.
А может можно и как-нибудь проще)
Пикселы снизу вверх построчно вроде бы хранятся

Offline

#3  04.11.08 23:52

Re: [Visual C++] как считать инфу с изображения?

не особо понял, но все равно спасибо))

может кто нибудь попроще предложит вариант?)

Offline

#4  05.11.08 00:42

Re: [Visual C++] как считать инфу с изображения?

В MSDN про это точно написано, и по моему даже примеры там есть. К сожалению. у меня его щас нет, потому конкретно ничего подсказать не могу.

Offline

#5  05.11.08 18:59

Re: [Visual C++] как считать инфу с изображения?

Offline

#6  06.11.08 00:22

Re: [Visual C++] как считать инфу с изображения?

Fatboy,  большое спасибо)

GrAnD,  читаю вот щас..ничего не нашел  пока что((

Offline

#7  08.11.08 14:48

Maq
Профиль

Re: [Visual C++] как считать инфу с изображения?

взято с инета+дописал как получить значение в пикселе
обработку ошибок естественно можно изменить, я не стал что-либо трогать:)

Код::

bool GetPixels(CString szResource, CString szResourceType, BOOL fFromFile, HINSTANCE hMod)
{
		class CULLoadImageErr
		{
		public:
			enum enErr
			{
				eFindResource =-1,
				eLoadResource =-2,
				eLockResource =-3,
				eCreateStreamOnHGlobal =-4,
				eOleLoadPicture =-5,
				eGetObject =-6
			};
		protected:
			enErr m_nErr;
		public: 
			CULLoadImageErr(enErr nErr):m_nErr(nErr){};
			enErr GetError()
			{return m_nErr;}
		};
		HRESULT hr;
		CComPtr<IStream> pStream;
		CComPtr<IPicture> pPicture;
		HRSRC rc=NULL; 
		LPVOID lpImage=NULL;
		HGLOBAL hgl=NULL;
		DWORD dwSize=0;
		LPVOID pNewMem=NULL;
		try
		{
			if(fFromFile==FALSE)
			{//вариант загрузки из ресурсов
				//ищем ресурс
				rc=::FindResource(hMod,szResource,szResourceType);
				if(rc==NULL)
					throw CULLoadImageErr(CULLoadImageErr::eFindResource);
				//определяем размер ресурса
				dwSize = ::SizeofResource(hMod, rc); 
				// читаем ресурс
				hgl=::LoadResource(hMod,rc); 
				if(hgl==NULL)
					throw CULLoadImageErr(CULLoadImageErr::eLoadResource);
				lpImage=LockResource(hgl);
				if(lpImage==NULL)
					throw CULLoadImageErr(CULLoadImageErr::eLockResource);
				//копируем ресурс в отдельный блок памяти для создания потока
				pNewMem = (LPVOID)::GlobalAlloc(GMEM_FIXED,dwSize);
				if(pNewMem==NULL)
					throw CULLoadImageErr(CULLoadImageErr::eLockResource);
				::CopyMemory(pNewMem,lpImage,dwSize);
				//создаём поток
				hr=::CreateStreamOnHGlobal((HGLOBAL)pNewMem,TRUE,&pStream);
				if(hr!=S_OK)
					throw CULLoadImageErr(CULLoadImageErr::eLockResource);
			}
			else
			{
				hr=::SHCreateStreamOnFile(szResource,STGM_SHARE_EXCLUSIVE,&pStream);
				if(hr!=S_OK)
					throw CULLoadImageErr(CULLoadImageErr::eCreateStreamOnHGlobal);
			}
			//загружаем картинку из потока
			hr = ::OleLoadPicture(pStream,0,FALSE,IID_IPicture,(void**)&pPicture);
			if((hr!=S_OK)||(pPicture==NULL))
				throw CULLoadImageErr(CULLoadImageErr::eOleLoadPicture);

			HBITMAP hBitmap=NULL;
			HBITMAP hBitmapRet=NULL;
			//получаем хендл битмапа
			pPicture->get_Handle((OLE_HANDLE*)(UINT*)&hBitmap);
			//получаем размер битмапа
			BITMAP bmp;
			if(GetObject(hBitmap,sizeof(BITMAP),&bmp)==0)
				throw CULLoadImageErr(CULLoadImageErr::eGetObject);
			//копируем битмап
			HDC hDTDC=::GetDC(NULL);
			HDC hSrcDC=::CreateCompatibleDC(hDTDC);
			hBitmap=(HBITMAP)::SelectObject(hSrcDC,hBitmap);

			for(int i=0; i <= bmp.bmHeight; i++)
			{
				for(int j=0; j < bmp.bmWidth; j++)
				{
					const COLORREF color = GetPixel(hSrcDC, j, i);
					const BYTE R = (BYTE)(color & 0xFF);
					const BYTE G = (BYTE)((color >> 8) & 0xFF);
					const BYTE B = (BYTE)((color >> 16) & 0xFF);
				}
			}

			::SelectObject(hSrcDC,hBitmap);

			//освобождаем GDI ресурсы
			::DeleteDC(hSrcDC);
			::ReleaseDC(NULL,hDTDC);
		}
		catch(CULLoadImageErr& e)
		{
			/*WTL::CString msg;
			msg.Format(_T("CULLoadImageErr: %d"), e.GetError());
			::MessageBox(0,msg,0,0);*/
			return false;
		}
		//освобождаем ресурсы
		if(hgl!=NULL)
		{
			UnlockResource(hgl);
			::FreeResource(hgl);
		}
		if(pNewMem!=NULL)
			::GlobalFree(pNewMem);
}

Offline

#8  10.11.08 10:22

Hix
Профиль

Re: [Visual C++] как считать инфу с изображения?

alexsashka те если не сикрет зачем???

Исправлено Hix (10.11.08 10:41)

Offline

#9  12.11.08 11:05

Re: [Visual C++] как считать инфу с изображения?

Hix,   я баку пишу)) прога для статистического анализа голограмм%)

Offline

#10  13.11.08 11:15

Hix
Профиль

Re: [Visual C++] как считать инфу с изображения?

alexsashka, если те не помог первый вариант, то есть варианты по проще не использующие ООП

Исправлено Hix (13.11.08 11:15)

Offline

Программирование и БД » [Visual C++] как считать инфу с изображения? 

ФутЕр:)

© Hostel Web Group, 2002-2025.   Сообщить об ошибке

Сгенерировано за 0.027 сек.
Выполнено 14 запросов.