- // 图像的写操作把DIB写入lpszPathName中
- // lpDib是指向信息头的图像指针
- BOOL WriteImageNew(LPCTSTR lpszPathName,LPBYTE lpDib)
- {
- // 信息头指针
- LPBITMAPINFOHEADER lpBmpInfoHead;
- // 文件头
- BITMAPFILEHEADER bmfh;
- // 指针类型转换
- lpBmpInfoHead = (LPBITMAPINFOHEADER)lpDib;
- // 计算颜色表长度
- int nColorTableLength = ComputeColorTableLength(lpBmpInfoHead->biBitCount);
- // 文件类型"BM"
- bmfh.bfType = 0x4d42;
- bmfh.bfSize = 0;
- bmfh.bfReserved1 = bmfh.bfReserved2 = 0;
- // 文件头偏移量(从文件头开始到实际图像数据阵列字节间的字节偏移量)
- // 中间包括了文件头、信息头、调色板(真彩色图像就没有)
- bmfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD)*nColorTableLength;
- HANDLE hFile;
- // 以写的方式打开一个文件,不存在就创建新的
- hFile = CreateFile(lpszPathName, GENERIC_WRITE, 0, NULL,
- CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
- if (INVALID_HANDLE_VALUE == hFile)
- return FALSE;
- // 写入文件头
- DWORD dwWrite;
- if (!WriteFile(hFile, &bmfh, sizeof(BITMAPFILEHEADER), &dwWrite, NULL))
- return FALSE;
- // 写入信息头
- if (!WriteFile(hFile, lpBmpInfoHead, sizeof(BITMAPINFOHEADER), &dwWrite, NULL))
- return FALSE;
- // 调色板指针
- LPRGBQUAD lpColorTable = (LPRGBQUAD)lpBmpInfoHead+ sizeof(BITMAPINFOHEADER);
- // 如果颜色表长度不为0就写入调色板数据
- if (nColorTableLength != 0)
- if (!WriteFile(hFile, lpColorTable, sizeof(RGBQUAD)*nColorTableLength, &dwWrite, NULL))
- return FALSE;
- // 整幅图像占的字节大小
- // 像素点占得字节数是4的整数倍
- // 可以这样写 (m_imgWidth*m_nBitCount/8+3)&~3;
- int imgBuffSize = (lpBmpInfoHead->biWidth*lpBmpInfoHead->biBitCount/8 + 3)/4*4*lpBmpInfoHead->biHeight;
- // 图像像素指针
- unsigned char* pImgData = (unsigned char *)lpColorTable + sizeof(RGBQUAD)*nColorTableLength;
- // 写入图像像素数据
- if (!WriteFile(hFile, pImgData, imgBuffSize, &dwWrite, NULL))
- return FALSE;
- // 关闭文件句柄
- CloseHandle(hFile);
- return TRUE;
- }