WEB开发网
开发学院软件开发VC TIF格式图像文件初探 阅读

TIF格式图像文件初探

 2009-10-27 20:31:22 来源:WEB开发网   
核心提示:三、实战1、VC创建一个MFC AppWizard(exe)工程取名TiffTest,选择单文档程序,TIF格式图像文件初探(2),2、添加TiffStruct.h文件,定义IFH和DE结构(参考前面的结构描述),读文件失败");return FALSE;}file.Seek(ifh.offsetToIFD,

三、实战

1、VC创建一个MFC AppWizard(exe)工程取名TiffTest,选择单文档程序。

2、添加TiffStruct.h文件,定义IFH和DE结构(参考前面的结构描述),用来接收读TIF文件的信息。

#ifndef _TIFFSTRUCT_
  #define _TIFFSTRUCT_
  typedef struct tagIMAGEFILEHEADER
  {
    WORD byteOrder;
    WORD version;
    DWORD offsetToIFD;
  }IFH;
  typedef struct tagDIRECTORYENTRY
  {
    WORD tag;
    WORD type;
    DWORD length;
    DWORD valueOffset;
  }DE;
  #endif

3、在文档类中添加4个公有变量,并将其初始化为0。在TiffTestDoc.cpp中#include "TiffStruct.h"

DWORD m_dwBmSize;  //图象的数据部分的大小
  CPalette m_palDIB;  //BMP图象调色板
  HANDLE m_hDIB;    //BMP图象内存块句柄
  CSize m_sizeDoc;  //图象的长和宽

4、在文档类的OnOpenDocument函数中定义局部工具变量并读文件

DWORD dwFileLength = 0;
  CString strTemp = _T("");
  WORD wDECount = 0;
  BYTE* pDIB = NULL;
  int i = 0;
  IFH ifh;
  ZeroMemory(&ifh, sizeof(IFH));
  CFile file;
  CFileException fe;
  if(0 == file.Open(lpszPathName, CFile::modeRead | CFile::shareDenyWrite, &fe))
  {
    AfxMessageBox("打开文件失败");
    return FALSE;
  }
  dwFileLength = file.GetLength();

读IFH文件头

if(sizeof(IFH) != file.Read(&ifh, sizeof(IFH)))
  {
    AfxMessageBox("读TIF文件头失败");
    return FALSE;
  }
  if(0x2a != ifh.version)
  {
    AfxMessageBox("该文件不是TIF格式,读文件失败");
    return FALSE;
  }
  if(0x4949 != ifh.byteOrder)
  {
    AfxMessageBox("该TIF文件不是IBMPC字节序,读文件失败");
    return FALSE;
  }
  file.Seek(ifh.offsetToIFD, CFile::begin);//将文件指针定位到IFD

读文件有多少个目录入口

if(2 != file.Read(&wDECount, 2))
  {
    AfxMessageBox("无法获得TIF文件目录入口数量");
    return FALSE;
  }
  strTemp.Format("该TIF文件有%d个目录入口", wDECount);
  AfxMessageBox(strTemp);

创建DE数组,接收信息,数组中有wDECount个元素

DE* pde = new DE[wDECount];
  DE* pTemp = pde;
  memset(pde, 0, sizeof(DE)*wDECount);
  if(sizeof(DE)*wDECount != file.ReadHuge(pde, sizeof(DE)*wDECount))
  {
    AfxMessageBox("读图象文件目录失败");
    delete []pde;
    return FALSE;
  }  

显示图像文件目录信息

for(i=0; itag, i, pTemp->type, i, pTemp->length, i, pTemp->valueOffset);
    AfxMessageBox(strTemp);
  }

把图像的大小和图像数据的容量保存到成员变量中

for(i=0; i<wDECount; i++)
  {
    pTemp = pde + i;
    if(256 == pTemp->tag)  //tag为256的目录入口中的变量标识了图象宽度
    {
      m_sizeDoc.cx = pTemp->valueOffset;
    }
    if(257 == pTemp->tag)  //图象高度
    {
      m_sizeDoc.cy = pTemp->valueOffset;
    }
    if(273 == pTemp->tag)  //计算图象数据占用字节数
    {
      //m_dwBmSize = pTemp->valueOffset - sizeof(IFH);
      //或者把tag=256的valueOffset乘以tag=257的valueOffset
      m_dwBmSize = m_sizeDoc.cx * m_sizeDoc.cy;
    }
  }

在文档类中创建一个成员工具函数CreateBmpBuffer,申请全局内存块以存放BMP文件结构数据

BOOL CTiffTestDoc::CreateBmpBuffer()
  {
    //申请BMP内存块
    m_hDIB = GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT,
      sizeof(BITMAPFILEHEADER) +
      sizeof(BITMAPINFOHEADER) +
      256*sizeof(RGBQUAD) +
      m_dwBmSize);
    if(NULL == m_hDIB)
    {
      AfxMessageBox("申请BMP内存块失败");
      return FALSE;
    }
    else
    {
      return TRUE;
    }
  }

Tags:TIF 格式 图像

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接