#include #include"CreateDIBSectionFromFile248.h" int CreateDIBSectionFromFile248(char *lpFileName,HBITMAP *lphBmp,LPVOID *lppPixel,BITMAPINFO *lpBmpInfo,CDF type) { HANDLE fh; DWORD dwFileSize,dwReadSize; LPBYTE lpbuf; LPBITMAPFILEHEADER lpbmpfh; LPBITMAPINFO lpbmpInfo; LPBYTE lpbmpPixel; LPRGBQUAD lpColorTable; int bitCount,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(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); CopyMemory(lpBmpInfo,&lpbmpInfo->bmiHeader,sizeof(BITMAPINFOHEADER)); lpBmpInfo->bmiHeader.biBitCount=type; *lphBmp=CreateDIBSection(NULL,lpBmpInfo,DIB_RGB_COLORS,(void**)lppPixel,NULL,0); switch(bitCount){ case 24: for(y=0;ybmiColors; for(y=0;y