TIFF文件处理

来源:互联网 发布:无线游戏鼠标推荐知乎 编辑:程序博客网 时间:2024/06/06 10:41

读TIFF图像文件CMYK各通道数据:

BOOL CCmykShowDoc::OnOpenDocument(LPCTSTR lpszPathName){if (!CDocument::OnOpenDocument(lpszPathName))return FALSE;// TODO: Add your specialized creation code hereWORD m_ium;CFile file;CFileException fe;TIFHEADER tifHeader;ZeroMemory(&tifHeader, sizeof(TIFHEADER));if(0 == file.Open(lpszPathName, CFile::modeRead | CFile::shareDenyWrite, &fe)){AfxMessageBox("打开文件失败");return FALSE;}//读取文件头结构if(sizeof(TIFHEADER) != file.Read(&tifHeader, sizeof(TIFHEADER))){AfxMessageBox("读TIF文件头失败");return FALSE;}if(!((0x4949==tifHeader.wImageType) && (0x002a== tifHeader.wVersion))){AfxMessageBox("该文件不是TIF格式,读文件失败");return FALSE;}file.Seek(tifHeader.IDirOffset,CFile::begin);           //从文件头结构中找到IFD首地址if(2 != file.Read(&m_ium,2)){AfxMessageBox("无法获得TIF文件目录入口数量");return FALSE;}TIFTAG* TifTag = new TIFTAG[m_ium];memset(TifTag, 0, sizeof(TIFTAG)*m_ium);for (int i=0;i<m_ium;i++){file.Read(&(TifTag[i].wTag),2);                      //读取Tag中的标识码file.Read(&(TifTag[i].wType),2);                     //读取Tag中的数据形态file.Read(&(TifTag[i].dwCount),4);                   //读取Tag的数据长度file.Read(&(TifTag[i].ValOff),4);                    //读取数据值或偏移量if (TifTag[i].wTag == 256){                          //得到图像的宽度m_nWidth = TifTag[i].ValOff.dwValue.wVal1;}if (TifTag[i].wTag == 257){                          //得到图像的高度m_nHeight = TifTag[i].ValOff.dwValue.wVal1;}if ((TifTag[i].wTag == 259)&&(TifTag[i].ValOff.dwValue.wVal1!=1)){AfxMessageBox("这个文件不是TIF无压缩格式");file.Close();return false;}if (TifTag[i].wTag == 262){                          //得到图像的色彩模式nColor = TifTag[i].ValOff.dwValue.wVal1;}if (TifTag[i].wTag == 273){                          //找到图像的存储位置lOffset = file.Seek(TifTag[i].ValOff.dwOffset,CFile::begin);}}file.Seek(lOffset, CFile::begin);PIXEL pixel;for (int h =0;h<m_nHeight;h++){for (int w=0;w<m_nWidth;w++){file.Read(&pixel,sizeof(PIXEL));m_pCdata[w+h*m_nWidth] = pixel.nC;m_pMdata[w+h*m_nWidth] = pixel.nM;m_pYdata[w+h*m_nWidth] = pixel.nY;m_pKdata[w+h*m_nWidth] = pixel.nK;m_pRdata[w+h*m_nWidth] = (255-pixel.nK)*(255-pixel.nC)/255;m_pGdata[w+h*m_nWidth] = (255-pixel.nK)*(255-pixel.nM)/255;m_pBdata[w+h*m_nWidth] = (255-pixel.nK)*(255-pixel.nY)/255;}}delete []TifTag;file.Close();    return TRUE;}

上述函数将图像的CMYK各通道数据存入数组,并转化为RGB同时存入数组。

各通道存为BMP图(C通道为例):

void CCmykShowDoc::OnSaveAsBmp() {#define WIDTHBYTES(bits)    (((bits) + 31) / 32 * 4)// TODO: Add your command handler code herePOSITION pos = GetFirstViewPosition();    CCmykShowView* pView = (CCmykShowView*)GetNextView(pos);//保存C通道数据if (pView->m_nDisplayType == 0){int i,j;BYTE* m_bitData=new BYTE[m_nHeight*m_nWidth];ZeroMemory((void*)m_bitData, m_nHeight*m_nWidth);for (i=0; i<m_nHeight; i++){for(j=0; j<m_nWidth; j++){m_bitData[i*m_nWidth+j]=m_pCdata[j+i*m_nWidth];}}LONG lWidth=m_nWidth;LONG lHeight=m_nHeight;LPBITMAPINFO lpbmi;// BMP文件头的句柄HANDLE hBmpFileHead;//计算信息头和调色板的大小hBmpFileHead=::GlobalAlloc(GHND,sizeof(BITMAPINFOHEADER)+ sizeof(RGBQUAD)* 256);if(hBmpFileHead==0){AfxMessageBox("分配内存失败");return;}//填充信息头lpbmi=(LPBITMAPINFO)::GlobalLock((HGLOBAL)hBmpFileHead);lpbmi->bmiHeader.biSize=sizeof(BITMAPINFOHEADER);lpbmi->bmiHeader.biWidth=lWidth;lpbmi->bmiHeader.biHeight=lHeight;lpbmi->bmiHeader.biPlanes=1;lpbmi->bmiHeader.biBitCount=8;lpbmi->bmiHeader.biCompression=BI_RGB;lpbmi->bmiHeader.biSizeImage=WIDTHBYTES(lWidth*8)*lHeight;lpbmi->bmiHeader.biXPelsPerMeter=0;lpbmi->bmiHeader.biYPelsPerMeter=0;lpbmi->bmiHeader.biClrUsed=256;lpbmi->bmiHeader.biClrImportant=256;//填充256级灰度调色板//int i,j;for( i=0;i<256;i++){lpbmi->bmiColors[i].rgbBlue=i;lpbmi->bmiColors[i].rgbGreen=i;lpbmi->bmiColors[i].rgbRed=i;lpbmi->bmiColors[i].rgbReserved=0;}//填充文件头BITMAPFILEHEADER bmfHeader;ZeroMemory(&bmfHeader,sizeof(bmfHeader));bmfHeader.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+ sizeof(RGBQUAD) * 256;bmfHeader.bfSize=lpbmi->bmiHeader.biSizeImage+bmfHeader.bfOffBits;bmfHeader.bfType='MB';BYTE* pBits=new BYTE[lpbmi->bmiHeader.biSizeImage];ZeroMemory((void*)pBits, lpbmi->bmiHeader.biSizeImage);for (i=0; i<lHeight; i++){for (j=0; j<lWidth;j++){pBits[WIDTHBYTES(lWidth*8)*(lHeight-1-i)+j]=m_bitData[i*lWidth+j];}}CString str="D://test//test.bmp";HANDLE hFile=CreateFile(str,GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);if(hFile!=INVALID_HANDLE_VALUE){DWORD dwRet=0;WriteFile(hFile,&bmfHeader,sizeof(bmfHeader),&dwRet,NULL);WriteFile(hFile,&lpbmi->bmiHeader,sizeof(lpbmi->bmiHeader),&dwRet,NULL);WriteFile(hFile,&lpbmi->bmiColors[0],sizeof(RGBQUAD) * 256,&dwRet,NULL);WriteFile(hFile,pBits,lpbmi->bmiHeader.biSizeImage,&dwRet,NULL);CloseHandle(hFile); }delete[] pBits;delete[] m_bitData;::GlobalUnlock((HGLOBAL)hBmpFileHead);        ::GlobalFree((HGLOBAL) hBmpFileHead);}}



原创粉丝点击