#include //BMP8or24toDIB 関数 //8ビット or 24ビットBMPを32ビットDIBに読み込みます //*fileName :読み込みたいファイルのパス //LPBITMAPINFO :情報を格納したい BITMAPINFO 構造体のポインタ //戻り値 :ピクセル配列を指すポインタ(正常) / NULL(エラー) LPDWORD BMP8or24toDIB(char *fileName,LPBITMAPINFO lpbiInfo) { HANDLE fhBMP; int iFileSize; LPBYTE lpBMP; DWORD dwReadSize; LPBITMAPFILEHEADER lpbmpfh; LPBITMAPINFO lpbiBMPInfo; WORD wBitCount; LPBYTE lpBMPPixel; LPDWORD dwColors; int iWidth,iHeight; LPDWORD lpPixel; int iLength,i,x,y; fhBMP=CreateFile(fileName,GENERIC_READ,0,NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); if(fhBMP==INVALID_HANDLE_VALUE){ CloseHandle(fhBMP); MessageBox(NULL,"ファイルが開けません",fileName,MB_OK); return NULL; } iFileSize=GetFileSize(fhBMP,NULL); lpBMP=(LPBYTE)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,iFileSize); ReadFile(fhBMP,lpBMP,iFileSize,&dwReadSize,NULL); CloseHandle(fhBMP); lpbmpfh=(LPBITMAPFILEHEADER)(lpBMP); lpbiBMPInfo=(LPBITMAPINFO)(lpBMP+sizeof(BITMAPFILEHEADER)); wBitCount=lpbiBMPInfo->bmiHeader.biBitCount; if(lpbmpfh->bfType!=('M'<<8)+'B' || (wBitCount!=8 && wBitCount!=24)){ HeapFree(GetProcessHeap(),0,lpBMP); MessageBox(NULL,"8ビット or 24ビットBMPファイルしか読み込めません",fileName,MB_OK); return NULL; } lpBMPPixel=lpBMP+(lpbmpfh->bfOffBits); dwColors=(LPDWORD)(lpbiBMPInfo->bmiColors); iWidth=lpbiBMPInfo->bmiHeader.biWidth; iHeight=lpbiBMPInfo->bmiHeader.biHeight; lpPixel=(LPDWORD)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(DWORD)*iWidth*iHeight); lpbiInfo->bmiHeader.biSize=sizeof(BITMAPINFOHEADER); lpbiInfo->bmiHeader.biWidth=iWidth; lpbiInfo->bmiHeader.biHeight=iHeight; lpbiInfo->bmiHeader.biPlanes=1; lpbiInfo->bmiHeader.biBitCount=32; lpbiInfo->bmiHeader.biCompression=BI_RGB; //横のバイト数は4の倍数でなければならない i=iWidth*(wBitCount/8); //横のバイト数 if(i%4) iLength=i+(4-i%4); else iLength=i; switch(wBitCount){ case 8: for(y=0;y