这个好象需要了解图片的数据结构哦,网上找了一下,分享如下,估计对对限制传的文件内容检测有帮助

  就是限制只能上传 .bmp, .gif, .jpg, .png图片,根据各个图片文件标志进行判断,

  .BMP图片文件的数据结构

  ================================================================================

  http://blog.csdn.net/jurrah/archive/2009/05/09/4163418.aspx

  http://lzqing422.blog.163.com/blog/static/1893108200811236425464/

  BMP文件组成 BMP文件由文件头、位图信息头、颜色信息和图形数据四部分组成。

  其中文件头的长度为固定值54个字节,文件头定义

  BMP文件头

  BMP文件头数据结构含有BMP文件的类型、文件大小和位图起始位置等信息。

  其结构定义如下:

  typedef struct tagBITMAPFILEHEADER

  {

  WORD bfType; // 位图文件的类型,必须为BM

  DWORD bfSize; // 位图文件的大小,以字节为单位

  WORD bfReserved1; // 位图文件保留字,必须为0

  WORD bfReserved2; // 位图文件保留字,必须为0

  DWORD bfOffBits; // 位图数据的起始位置,以相对于位图文件头的偏移量表示,以字节为单位

  } BITMAPFILEHEADER;

  其中,bfType在图像文件存储空间中的数据地址为0,数据类型为unsignedchar,内 容为固定值“BM”,用于标志文件格式,表示该图像文件为BMP文件。

  其他信息省略...具体参考上面的网址

  .GIF图片文件的数据结构

  ================================================================================

  http://bardo.javaeye.com/blog/659026

  GIF图像文件是以块的形式来存储图像信息,其中的块又称为区域结构。按照其中 块的特征又可以将所有的块分成三大类,分别是:

  控制块(Control Block)、

  图像描述块(Graphic Rendering Block)和

  特殊用途块(Special Purpose Block)。

  控制块:包含了控制数据流的处理以及硬件参数的设置,其成员主要包括:

  文件头信息、

  逻辑屏幕描述块、

  图像控制扩充块和

  文件结尾块。

  GIF的文件头只有六个字节,其结构定义如下:

  typedef struct gifheader

  {

  BYTE bySignature[3]; //GIF文件标示码,其固定值为“GIF”

  BYTE byVersion[3]; //GIF文件的版本信息。其取值固定为“87a”和“89a”

  } GIFHEADER;

  其中:

  bySignature:为GIF文件标示码,其固定值为“GIF”,使用者可以通过该域来判断一个图像文件是否是GIF图像格式的文件。

  byVersion:表明GIF文件的版本信息。其取值固定为“87a”和“89a”。分别表示GIF文件的版本为GIF87a或GIF89a。这两个版本有一些不同:

  GIF87a公布的时间为1987年,该版本不支持动画和一些扩展属性。

  GIF89a是1989年确定的一个版本标准,只有89a版本才支持动画、注释扩展和文本扩展。

  其他信息省略...具体参考上面的网址

  .JPG图片文件的数据结构

  ================================================================================

  http://zhidao.baidu.com/question/206584199.html

  jpg的结构:

  JFIF文件格式即JPEG文件交换格式(JPEG File Interchonge Format)。一般的JFIF文件由下面的9个部分组成:

  (字段偏移量 字段长度(若未说明“长度不定”则表明在任何情况下长度均为所写的值) 字段内容(若未说明“内容不定”则在任何情况下内容均为所写的值,为方便表示还可以把内容设为某值))

  (1) 图像开始SOI(Start of Image)标记

  0h 2字节 0xFFD8

  (2) APP0标记(Marker)

  0h 2字节 0xFFE0

  ① APP0长度(length)(①~⑨九个字段的总长度)

  2h 2字节 内容不定(①~⑨九个字段的总长度)

  ② 标识符(identifier)

  4h 5字节 0x4A46494600 即“JFIF0”

  ③ 版本号(version)

  9h 2字节 0x0102 JFIF的版本号目前基本上都是1.2

  ④ X和Y的密度单位(units=0:无单位;units=1:点数/英寸;units=2:点数/厘米)

  bh 1字节 只有0,1,2三个值可选,其分别代表的意义如上

  ⑤ X方向像素密度(X density)

  ch 2字节 取值范围未知

  ⑥ Y方向像素密度(Y density)

  eh 2字节 取值范围未知

  ⑦ 缩略图水平像素数目(thumbnail horizontal pixels)

  10h 1字节 取值范围未知

  ⑧ 缩略图垂直像素数目(thumbnail vertical pixels)

  11h 1字节 取值范围未知

  ⑨ 缩略图RGB位图(thumbnail RGB bitmap)

  12h 长度可能是3的倍数 内容不定

  本段(APP0)可以包含图像的一个微缩版本,存为24位的RGB像素。如果没有微缩图像

  (这种情况更常见),则⑦“缩略图水平像素数目”和⑧“缩略图垂直像素数目”的值均为0。

  ...

  (9) 图像结束EOI(End of Image)

  0h 2字节 0xFFD9

  其他信息省略...具体参考上面的网址

  .PNG图片文件的数据结构

  ================================================================================

  http://hi.baidu.com/hhld/blog/item/4b323934372ba83c5bb5f5b4.html

  PNG定义了两种类型的数据块,一种是称为关键数据块,这是标准的数据块,另一种叫做辅助数据

  块,这是可选的数据块。关键数据块定义了5个标准数据块,每个PNG文件都必须包含它们,PNG读写软

  件也必须要支持这些数据块。至于可选数据块,规范只是提倡予以支持。

  PNG中数据块的类别,其中 * 号表示关键数据块,有

  第一块 PNG文件标识

  第二块 IHDR 文件头数据块

  调色板数据块 PLTE

  图像数据块 IDAT

  PNG文件标识

  它固定为8个字节:89 50 4E 47 0D 0A 1A 0A,前4个字节为“.PNG”的 Ascii 码。

  其他信息省略...具体参考上面的网址

 
目前共有0条评论
  • 暂无Trackback
你目前的身份是游客,评论请输入昵称和电邮!