19,469
社区成员
发帖
与我相关
我的任务
分享
BYTE* pBmpData; //Bmp文件数据
BYTE ** pData; // 二维数组按照条带存放数据
BITMAPFILEHEADER bmpFileHeader; // Bmp文件头
BITMAPINFOHEADER bmpInfoHeader; // Bmp信息头指针
bool myTIFF::TiffDataToBMP() // Tiff 图像数据转为BMP数据
{
memset(&bmpFileHeader, 0, sizeof(BITMAPFILEHEADER));
memset(&bmpInfoHeader, 0, sizeof(BITMAPINFOHEADER));
DWORD bfSize = ceil(double((iWidth*iHeight*2+54)/4.0))*4; // 用于4个字节对齐
bmpFileHeader.bfType = 0x4d42;
bmpFileHeader.bfSize = bfSize;
bmpFileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
bmpFileHeader.bfReserved1 = 0 ;
bmpFileHeader.bfReserved2 = 0 ;
bmpInfoHeader.biBitCount = 16 ;
bmpInfoHeader.biWidth = iWidth ;
bmpInfoHeader.biHeight = iHeight ;
bmpInfoHeader.biPlanes = 1 ;
bmpInfoHeader.biSize = sizeof(BITMAPINFOHEADER) ;
bmpInfoHeader.biSizeImage = 0;
bmpInfoHeader.biClrImportant = 0 ;
bmpInfoHeader.biClrUsed = 0 ;
bmpInfoHeader.biCompression = BI_RGB ;
bmpInfoHeader.biXPelsPerMeter = 0 ;
bmpInfoHeader.biYPelsPerMeter = 0 ;
if(pBmpData)
{
delete []pBmpData;
pBmpData = NULL;
}
DWORD dataSize = ceil(double((iWidth*iHeight*2)/4.0))*4;
pBmpData = new BYTE[dataSize];
memset(pBmpData,0,dataSize);
int lineLen = iWidth*iBit/8; // 每行的字节数
DWORD counts = 0; // 已拷贝到pBmpData的字节数(倒叙拷贝)
for (int i=0;i<iStripCounts;i++) // 条带数
{ // 数据的拷贝应该都没问题,因为图像显示是正确的,只是存在失真问题
int ij = FourByte2Dword(byteCounts,(iStripCounts-1-i)*iStripOffsetType)/lineLen;
for (int j=0;j<ij;j++)
{
StrictCpy(pBmpData,counts,pData[iStripCounts-1-i],j*lineLen,lineLen);
counts += lineLen;
}
}
delete []byteCounts;
byteCounts = NULL;
for (int k=0;k<iStripCounts;k++)
{
delete []pData[k];
}
delete []pData;
return true;
}
DWORD myTIFF::StrictCpy(BYTE*des,int pos,BYTE*src,int iBegin,int len) // 目标串 目标串位置 源串 源串开始位置 拷贝长度
{
ASSERT(des);
ASSERT(src);
int i = 0;
for (i=0;i<len;i++)
{
des[pos+i] = src[iBegin+i];
}
return (pos+len);
}
void myTIFF::DrawImage(HDC hdc, int iLeft, int iTop, int Width, int Height) // 用于绘图到控件,显示图像效果同保存后效果
{
if(!hdc || pBmpData == NULL)
return;
BITMAPINFO bmi;
memset(&bmi, 0, sizeof(bmi));
bmi.bmiHeader.biSize = sizeof(BITMAPINFO);
bmi.bmiHeader.biWidth = iWidth;
bmi.bmiHeader.biHeight = iHeight;
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biBitCount = iBit;
bmi.bmiHeader.biCompression = BI_RGB;
bmi.bmiHeader.biSizeImage = ceil(double((iWidth*iHeight*2+54)/4.0))*4;
StretchDIBits(hdc, iLeft, iTop, Width, Height,0, 0, iWidth,iHeight,pBmpData, &bmi, DIB_RGB_COLORS, SRCCOPY);// StretchDIBits
}
bool myTIFF::SaveBitmap(CString path) // 保存为BMP文件 未添加调色板
{
//保存文件
CFile fp;
fp.Open(path,CFile::modeCreate | CFile::modeWrite);
fp.Write((LPSTR)&bmpFileHeader,sizeof(BITMAPFILEHEADER)); //写文件头
fp.Write((LPSTR)&bmpInfoHeader,sizeof(BITMAPINFOHEADER)); //写信息头
fp.Write(pBmpData,ceil(double((iWidth*iHeight*2+54)/4.0))*4);//写数据
fp.Close();
return true;
}
DWORD myTIFF::FourByte2Dword(BYTE*pBuf,int idx)
{
ASSERT(pBuf);
ASSERT(idx>=0);
DWORD location = 0;
location = (pBuf[idx]<<24) + (pBuf[idx+1]<<16) + (pBuf[idx+2]<<8) + pBuf[idx+3];
return location;
}