qq空间密码破解方法-宽带网速测试器
2023年4月6日发(作者:台式机的配置)
一ouTIF图由四个部分组成:
1、图像文件头(ImageFileHeader简称IFH):
图一IFH结构描述
IFH数据结构包含3个成员共计8个字节,Byteorder成员可能是
“MM”(0x4d4d)或“II”(0x4949),0x4d4d表示该TIFF图是摩托罗拉整数格式
0x4949表示该图是Intel整数格式;Version成员总是包含十进制42(0x2a),
它用于进一步校验该文件是否为TIF格式,42这个数并不是一般人想象中的
那样认为是tif软件的版本,实际上,42这个数大概永远不会变化;第三个成
员是IFD(接下来要说的第二个数据结构)相对文件开始处的偏移量。
2、图像文件目录(ImageFileDirectory简称IFD):
图二IFD及DE结构描述
IFD是TIF图中最重要的数据结构,它包含了一个TIF文件中最重要的信息,
一个TIF图可能有多个IFD,这说明文件中有多个图像,每个IFD标识1个图
像的基本属性。IFD结构中包含了三类成员,DirectoryEntryCount指出该结
构里面有多少个目录入口;接下来就是N个线性排列的DE序列,数量不定(这
就是为什么称TIF格式文件为可扩充标记的文件,甚至用户可以添加自定义的
标记属性),每个DE标识了图像的某一个属性;最后就是一个偏移量,标识下
一个文件目录相对于文件开始处的位置,当然,如果该TIF文件只包含了一幅图
像,那么就只有一个IFD,显然,这个偏移量就等于0;
3、目录入口(DirectoryEntry简称DE):
共12个字节,见图二。简单说,一个DE就是一幅图像的某一个属性。例如
图像的大小、分辨率、是否压缩、像素的行列数、一个像素由几位表示(1位
代表黑白两色,8位代表256色等等)等。其中:tag成员是该属性的编号,在
图像文件目录中,它是按照升序排列的。我们可以通过读这些编号,然后到TIF
格式官方白皮书中查找相应的含义。属性是用数据来表示的,那么type就是代
表着该数据的类型,TIF官方指定的有5种数据类型。type=1就是BYTE类型(8
位无标记整数)、type=2是ASCII类型(7位ASCII码加1位二进制0)、type=3
是SHORT类型(16位无标记整数)、type=4是LONG类型(32位无标记整数)、
type=5是RATIONAL类型(2个LONG,第一个是分子,第二个是分母)。length
成员是数据的数量而不是数据类型的长度。第4个成员valueOffset很重要,
它是tag标识的属性代表的变量值相对文件开始处的偏移量。如果变量值占用的
空间小于4个字节,那么该值就存放在valueOffset中即可,没必要再另外指
向一个地方了。
4、图像数据本例提供的图像是基于256灰度级的,即一个字节代表一个像素点,
它是0x00~0xff区间中256个灰度级的任意一个整数。通过使用UltraEdit工
具观察,我们发现该图像文件的组织形式是:IFH--数据--IFD。以下的示例说
明遵循了这一观察结果。
三、实战
1、VC创建一个MFCAppWizard(exe)工程取名TiffTest,选择单文档程序。
2、添加TiffStruct.h文件,定义IFH和DE结构(参考前面的结构描述),用
来接收读TIF文件的信息。
#ifndef_TIFFSTRUCT_
#define_TIFFSTRUCT_
typedefstructtagIMAGEFILEHEADER
{
WORDbyteOrder;
WORDversion;
DWORDoffsetToIFD;
}IFH;
typedefstructtagDIRECTORYENTRY
{
WORDtag;
WORDtype;
DWORDlength;
DWORDvalueOffset;
}DE;
#endif
3、在文档类中添加4个公有变量,并将其初始化为0。在中
#include"TiffStruct.h"
DWORDm_dwBmSize;//图象的数据部分的大小
CPalettem_palDIB;//BMP图象调色板
HANDLEm_hDIB;//BMP图象内存块句柄
CSizem_sizeDoc;//图象的长和宽
4、在文档类的OnOpenDocument函数中定义局部工具变量并读文件
DWORDdwFileLength=0;
CStringstrTemp=_T("");
WORDwDECount=0;
BYTE*pDIB=NULL;
inti=0;
IFHifh;
ZeroMemory(&ifh,sizeof(IFH));
CFilefile;
CFileExceptionfe;
if(0==(lpszPathName,CFile::modeRead|
CFile::shareDenyWrite,&fe))
{
AfxMessageBox("打开文件失败");
returnFALSE;
}
dwFileLength=gth();
读IFH文件头
if(sizeof(IFH)!=(&ifh,sizeof(IFH)))
{
AfxMessageBox("读TIF文件头失败");
returnFALSE;
}
if(0x2a!=n)
{
AfxMessageBox("该文件不是TIF格式,读文件失败");
returnFALSE;
}
if(0x4949!=der)
{
AfxMessageBox("该TIF文件不是IBMPC字节序,读文件失败");
returnFALSE;
}
(ToIFD,CFile::begin);//将文件指针定位到IFD
读文件有多少个目录入口
if(2!=(&wDECount,2))
{
AfxMessageBox("无法获得TIF文件目录入口数量");
returnFALSE;
}
("该TIF文件有%d个目录入口",wDECount);
AfxMessageBox(strTemp);
创建DE数组,接收信息,数组中有wDECount个元素
DE*pde=newDE[wDECount];
DE*pTemp=pde;
memset(pde,0,sizeof(DE)*wDECount);
if(sizeof(DE)*wDECount!=ge(pde,sizeof(DE)*wDECount))
{
AfxMessageBox("读图象文件目录失败");
delete[]pde;
returnFALSE;
}
显示图像文件目录信息
for(i=0;itag,i,pTemp->type,i,pTemp->length,i,pTemp->valueOffset);
AfxMessageBox(strTemp);
}
把图像的大小和图像数据的容量保存到成员变量中
for(i=0;i
{
pTemp=pde+i;
if(256==pTemp->tag)//tag为256的目录入口中的变量标识了图象宽度
{
m_=pTemp->valueOffset;
}
if(257==pTemp->tag)//图象高度
{
m_=pTemp->valueOffset;
}
if(273==pTemp->tag)//计算图象数据占用字节数
{
//m_dwBmSize=pTemp->valueOffset-sizeof(IFH);
//或者把tag=256的valueOffset乘以tag=257的valueOffset
m_dwBmSize=m_*m_;
}
}
在文档类中创建一个成员工具函数CreateBmpBuffer,申请全局内存块以存放
BMP文件结构数据
BOOLCTiffTestDoc::CreateBmpBuffer()
{
//申请BMP内存块
m_hDIB=GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT,
sizeof(BITMAPFILEHEADER)+
sizeof(BITMAPINFOHEADER)+
256*sizeof(RGBQUAD)+
m_dwBmSize);
if(NULL==m_hDIB)
{
AfxMessageBox("申请BMP内存块失败");
returnFALSE;
}
else
{
returnTRUE;
}
}
回到OnOpenDocument成员函数中调用工具函数并获得全局内存块指针
//构造BMP图象内存块
if(!CreateBmpBuffer())
{
AfxMessageBox("构造BMP图象内存块失败");
delete[]pde;
returnFALSE;
}
//获得BMP内存块指针
pDIB=(BYTE*)GlobalLock(m_hDIB);
if(NULL==pDIB)
{
AfxMessageBox("获得BMP内存块指针失败");
GlobalUnlock(m_hDIB);
delete[]pde;
returnFALSE;
}
以下是将图像信息填充到BMP内存块中,网上介绍BMP格式的文章很多,这
里就不详述了。因测试图像数据表达的是0x00-0xff灰度,正好和BMP文件调
色板索引值巧合。故在代码中直接把图像数据信息当成索引即可,减少了编码
复杂度。注:BMP文件中图像数据的第一行代表的是最终显示光栅的最后一行,
所以在数据排列中要颠倒过来。
//构造BITMAPFILEHEADER并复制到BMP内存块
BITMAPFILEHEADERbmfHdr;
memset(&bmfHdr,0,sizeof(BITMAPFILEHEADER));
its=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)
+
256*sizeof(RGBQUAD);
rved1=0;
rved2=0;
=its+m_dwBmSize;
=0x4d42;
memmove(pDIB,&bmfHdr,sizeof(BITMAPFILEHEADER));
//构造BITMAPINFOHEADER并复制到BMP内存块
BITMAPINFOHEADERbmiHdr;
memset(&bmiHdr,0,sizeof(BITMAPINFOHEADER));
ount=8;
mportant=0;
sed=0;
ression=0;
ht=m_;
es=1;
=sizeof(BITMAPINFOHEADER);
Image=0;
h=m_;
sPerMeter=2834;
sPerMeter=2834;
memmove((BITMAPFILEHEADER*)pDIB+1,&bmiHdr,
sizeof(BITMAPINFOHEADER));
//构造256个RGBQUAD并复制到BMP内存块
RGBQUAD*pRgbQuad=(RGBQUAD*)(pDIB+sizeof(BITMAPFILEHEADER)+
sizeof(BITMAPINFOHEADER));
RGBQUAD*pOldQuad=pRgbQuad;
RGBQUADrgbQuad;
memset(&rgbQuad,0,sizeof(RGBQUAD));
for(i=0;i<256;i++)
{
e=i;
en=i;
=i;
erved=0;
pRgbQuad=pOldQuad+i;
memmove(pRgbQuad,&rgbQuad,sizeof(RGBQUAD));
}
//填充所有像素数据,颠倒图象数据从最后一行开始读起
intj=0;
for(i=m_-1;i>=0;i--)
{
(sizeof(IFH)+i*m_,CFile::begin);
((BYTE*)(pRgbQuad+1)+j*m_,m_);
j++;
}
初始化BMP调色板,为显示BMP文件做准备
//初始化专用调色板
BYTEbuf[2+2+4*256];
LOGPALETTE*pPal=(LOGPALETTE*)buf;
pPal->palVersion=0x300;
pPal->palNumEntries=256;
for(i=0;i<255;i++)
{
pPal->palPalEntry[i].peBlue=i;
pPal->palPalEntry[i].peFlags=0;
pPal->palPalEntry[i].peGreen=i;
pPal->palPalEntry[i].peRed=i;
}
m_Palette(pPal);
最后是OnOpenDocument成员函数返回前的清理工作
GlobalUnlock(m_hDIB);
delete[]pde;
returnTRUE;
至此,TIF文件信息已转换为BMP图像并保存在全局内存块中了,接下来就
可以在OnDraw中调用WinAPI函数StretchDIBits来显示它。
if(NULL==pDoc->m_hDIB)
{
return;
}
HDChdc=pDC->m_hDC;
BYTE*pBuf=(BYTE*)GlobalLock(pDoc->m_hDIB);
pBuf+=sizeof(BITMAPFILEHEADER);
BYTE*pData=pBuf+sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD);
CPalette*pOldPal=pDC->SelectPalette(&pDoc->m_palDIB,TRUE);
pDC->RealizePalette();
::SetStretchBltMode(hdc,COLORONCOLOR);
::StretchDIBits(hdc,10,10,pDoc->m_,pDoc->m_,
0,0,pDoc->m_,pDoc->m_,pData,
(BITMAPINFO*)pBuf,DIB_RGB_COLORS,SRCCOPY);
pDC->SelectPalette(pOldPal,FALSE);
GlobalUnlock(pDoc->m_hDIB);
最后别忘了在文档类析构函数~CTiffTestDoc中销毁全局内存块
if(NULL!=m_hDIB)
{
GlobalFree(m_hDIB);
m_hDIB=NULL;
}
NewProfiles
NameGraphicsAPIDomainGraphicshardwarerequired
vs_4_0Direct3D10.0VertexMulti-VendorDirectX10GPUs
ps_4_0Direct3D10.0FragmentMulti-VendorDirectX10GPUs
ExistingProfiles
NameGraphicsAPIDomainGraphicshardwarerequired
gp4vpOpenGLVertexGeForce8seriesNV_gpu_program4+NV_vertex_program4
gp4gpOpenGLGeometry
GeForce8seriesNV_gpu_program4+
NV_geometry_program4
gp4fpOpenGLFragment
GeForce8seriesNV_gpu_program4+
NV_fragment_program4
hlslvDirectX9cVertexMulti-vendorDirectX9cGPUs
hlslfDirectX9cFragmentMulti-vendorDirectX9cGPUs
glslvOpenGLVertexMulti-vendorOpenGL2.0/GLSLGPUs
glslfOpenGLFragmentMulti-vendorOpenGL2.0/GLSLGPUs
RB_vertex_program
RB_fragment_program
vp40OpenGLVertexGeForce6andupNV_vertex_program3
fp40OpenGLFragmentGeForce6andupNV_fragment_program2
vp30OpenGLVertexGeForce5andupNV_vertex_program2
fp30OpenGLFragmentGeForce5andupNV_fragment_program
vp20OpenGLVertexGeForce3,4Ti,andupNV_vertex_program
fp20OpenGLFragment
GeForce3,4Ti,andupNV_texture_shader+
NV_register_combiners2
vs_1_1
DirectX8&
9
VertexMulti-vendorDirectX8&9GPUs
ps_1_1
DirectX8&
9
FragmentMulti-vendorDirectX8&9GPUs
ps_1_2
DirectX8&
9
FragmentMulti-vendorDirectX8&9GPUs
ps_1_3
DirectX8&
9
FragmentMulti-vendorDirectX8&9GPUs
vs_2_0DirectX9VertexMulti-vendorDirectX9GPUs
ps_2_0DirectX9FragmentMulti-vendorDirectX9GPUs
vs_2_xDirectX9VertexMulti-vendorDirectX9GPUs
ps_2_xDirectX9FragmentMulti-vendorDirectX9GPUs
vs_3_0DirectX9cVertexMulti-vendorDirectX9cGPUs
ps_3_0DirectX9cFragmentMulti-vendorDirectX9cGPUs
更多推荐
directx 9 0下载
发布评论