#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
#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
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
#9 12.11.08 11:05
Re: [Visual C++] как считать инфу с изображения?
Hix, я баку пишу)) прога для статистического анализа голограмм%)
Offline

