#include #include"CreateDIBfromFile248.h" int CreateDIBfromFile248(char *lpFileName,LPVOID *lppPixel,LPBITMAPINFO *lppBmpInfo,CDF type) { HANDLE fh; DWORD dwFileSize,dwReadSize; LPBYTE lpbuf; LPBITMAPFILEHEADER lpbmpfh; LPBITMAPINFO lpbmpInfo; LPBYTE lpbmpPixel; LPRGBQUAD lpColorTable; int bitCount,nColorTable,iWidth,iHeight,iLenSrc,iLenDst,x,y; fh=CreateFile(lpFileName,GENERIC_READ,0,NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); if(fh==INVALID_HANDLE_VALUE){ MessageBox(NULL,"ファイルが開けません",lpFileName,MB_OK); return -1; } dwFileSize=GetFileSize(fh,NULL); lpbuf=(LPBYTE)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,dwFileSize); ReadFile(fh,lpbuf,dwFileSize,&dwReadSize,NULL); CloseHandle(fh); lpbmpfh=(LPBITMAPFILEHEADER)lpbuf; lpbmpInfo=(LPBITMAPINFO)(lpbuf+sizeof(BITMAPFILEHEADER)); bitCount=lpbmpInfo->bmiHeader.biBitCount; if(lpbmpfh->bfType!=('M'<<8)+'B' || (bitCount!=24 && bitCount!=8)){ HeapFree(GetProcessHeap(),0,lpbuf); MessageBox(NULL,"24 or 8 ビットBMPファイルしか読み込めません",lpFileName,MB_OK); return -2; } lpbmpPixel=lpbuf + lpbmpfh->bfOffBits; iWidth=lpbmpInfo->bmiHeader.biWidth; iHeight=lpbmpInfo->bmiHeader.biHeight; if(type==CT && bitCount!=8) type=BY; else if(type==DEF){ if(bitCount==24) type=BY; else if(bitCount==8) type=CT; } if(iWidth*(bitCount/8)%4) iLenSrc=iWidth*(bitCount/8)+(4-iWidth*(bitCount/8)%4); else iLenSrc=iWidth*(bitCount/8); if(iWidth*(type/8)%4) iLenDst=iWidth*(type/8)+(4-iWidth*(type/8)%4); else iLenDst=iWidth*(type/8); *lppPixel=HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,iLenDst*iHeight); if(type==CT) *lppBmpInfo=(LPBITMAPINFO)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,sizeof(BITMAPINFO)+255*4); else *lppBmpInfo=(LPBITMAPINFO)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,sizeof(BITMAPINFO)); switch(bitCount){ case 24: for(y=0;ybmiHeader.biClrUsed; if(nColorTable==0) nColorTable=256; lpColorTable=lpbmpInfo->bmiColors; switch(type){ case DW: case BY: for(y=0;ybmiColors[x]=lpColorTable[x]; break; } break; } CopyMemory(*lppBmpInfo,&lpbmpInfo->bmiHeader,sizeof(BITMAPINFOHEADER)); (*lppBmpInfo)->bmiHeader.biBitCount=type; HeapFree(GetProcessHeap(),0,lpbuf); return iLenDst; } void DeleteDIB(LPVOID *lppPixel,LPBITMAPINFO *lppBmpInfo) { if(*lppPixel!=NULL){ HeapFree(GetProcessHeap(),0,*lppPixel); *lppPixel=NULL; } if(*lppBmpInfo!=NULL){ HeapFree(GetProcessHeap(),0,*lppBmpInfo); *lppBmpInfo=NULL; } }