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);}}
阅读全文
0 0
- TIFF文件处理
- 使用LibTiff处理TIFF文件
- VC下使用LibTiff处理TIFF文件
- VC下使用LibTiff处理TIFF文件
- VC下使用LibTiff处理TIFF文件
- VC下使用LibTiff处理TIFF文件
- VC下使用LibTiff处理TIFF文件(转载)
- 【python图像处理】tiff文件的保存与解析
- C#处理TIFF格式
- tiff文件读取
- tiff文件读取
- TIFF文件读取
- TIFF文件读出页数
- TIFF文件读写初探
- tiff文件读取若干问题
- TIFF文件解析
- TIFF文件切割
- Tiff转换Bitmap处理方法
- pip install conda之后出现问题
- SQlite数据库的C编程接口(八) 工具函数(Utility Functions) ——《Using SQlite》读书笔记
- 谁先击完40下鼠标
- JUnit创建套件测试
- java内部类
- TIFF文件处理
- 你知道吗?Linux其实无所不在!
- hdu 2067 卡特兰数防止溢出计算方法
- java后台HttpClient调用http接口实例
- etcd rest api基本操作
- NodeJS调试工具 — node-inspector
- 矩阵乘法的本质是什么?
- Java导入excel大量数据出现内存溢出解决方案
- iOS 常见错误之 _dns_parse_resource_record", referenced from:解决方法