求解,不同的文件我需要不同的处理,必须判断文件类型,不能简单通过后缀名来判断,因为后缀名是可以改的

解决方案 »

  1.   

    没种格式头几个字节都是固定的 比如gif是gif98什么的 你用ue看下就知道了
      

  2.   

    不清楚Delphi的语法,给你断VB的代码,是通过读文件方式来获取的 
    Public Enum ImageFormatEnum
        Bmp = 0
        JPG = 1
        GIF = 2
        PNG = 3
        WMF = 4
        Other = 5
    End EnumPrivate Function GetImageFormat(Filename As String) As ImageFormatEnum
        Dim FileNumber As Long
        FileNumber = FreeFile
        Open Filename For Binary As FileNumber
        Dim Temp(3) As Byte
        Get #FileNumber, 1, Temp()
        If Temp(0) = &H42 And Temp(1) = &H4D Then
            GetImageFormat = ImageFormatEnum.Bmp
        ElseIf Temp(0) = &HFF And Temp(1) = &HD8 And Temp(2) = &HFF Then
            GetImageFormat = ImageFormatEnum.JPG
        ElseIf Temp(0) = &H47 And Temp(1) = &H49 And Temp(2) = &H46 And Temp(3) = &H38 Then
            GetImageFormat = ImageFormatEnum.GIF
        ElseIf Temp(0) = &H89 And Temp(1) = &H50 And Temp(2) = &H4E And Temp(3) = &H47 Then
            GetImageFormat = ImageFormatEnum.PNG
        Else
            GetImageFormat = ImageFormatEnum.Other
        End If
        Close FileNumber
    End Function其实如果只是为了判断是BMP还是JPG的话,也可以这样调用API函数LoadImage ,如果是BMP文件则返回值不为0,如果不是BMP的话,返回的就是0了。
      

  3.   

    const
      BufferSize = 16;
    var
      Buffer                 :STRING;
      F                      :File;
    begin
    AssignFile(F,'文件');
    try
      Reset (F,1);
      SetLength(Buffer, BufferSize);
      BlockRead(F,buffer[1], BufferSize);
      if POS('BM', buffer)=1        then
         //BMP
      else if POS(#$FF+#$D8, buffer)=1 then
         //JPEG
    ....
    ...
      

  4.   

    bmp文件头字节是“BM”或者:
    var
    _type:word;
    begin
     stream.ReadBuffer(_type,sizeof(word));//stream 是你读的流它的前2个字节保存的是图类型
           case _type of
                0:  ; //取出的是 ico
                55551:;//取出的是jpg 
                19778:;//取出的是bmp
           end ;
      

  5.   

    bmp文件包含了一个DIB(Device Indepentdent Bitmap)设备无关图。
    一个BMP文件大体上分成如下4个部分
    1,位图文件头BITMAPFILEHEADER,结构定义如下:
       typedef struct tagBITMAPFILEHEADER{
                     WORD bfType;
                     DWORD bfSize;
                     WORD  bfReserved1;
                     WORD  bfReserved2;
                     WORD  bfOffBits;
       }BITMAPFILEHEADER,FAR *LPBITMAPFILEHEADER,*PBITMAPFILEHEADER;
      该长度是固定的,为14字节2,位图信息头BITMAPINFOHEADER,结构定义如下:
       typedef struct tagBITMAPINFOHEADER{
                    DWORD  biSize;
                    LONG   biWidth;
                    LONG   biHeight;
                    WORD   biPlanes;
                    DWORD  biBitCount;
                    DWORD  biCompression;
                    DWORD  biSizeImage;
                    LONG   biXPelsPerMeter;
                    LONG   biYPelsPerMeter;
                    DWORD  biClrUsed;
                    DWORD  biClrImportant;
    }BITMAPINFOHEADER,FAR* LPBITMAPINFOHEADER, *PBITMAPINFOHEADER;
    改结构长度固定,为40个字节3,为调色板,实际上是一个数组,共有biClrUsed个元素,每个元素占4个字节,定义如下:
          typedef struct tagRGBQUAD{
                    BYTE rgbBlue;
                    BYTE rgbGreen;
                    BYTE rgbRed;
                    BYTE rgbReserved;
    }RGBQUAD;4,为实际的图像数据。
    2色位图 1个字节表示8个象素  
    16色位图 1个字节表示2个象素 
    256色位图 1个字节表示1个象素
    真彩色位图 3个字节表示1个象素
    JPEG文件由下面的8个部分组成:   
        
      (1)   图像开始SOI(Start   of   Image)标记   
        
      (2)   APP0标记(Marker)   
        
      ①   APP0长度(length)   
        
      ②   标识符(identifier)   
        
      ③   版本号(version)   
        
      ④   X和Y的密度单位(units=0:无单位;units=1:点数/英寸;units=2:点数/厘米)   
        
      ⑤   X方向像素密度(X   density)   
        
      ⑥   Y方向像素密度(Y   density)   
        
      ⑦   缩略图水平像素数目(thumbnail   horizontal   pixels)   
        
      ⑧   缩略图垂直像素数目(thumbnail   vertical   pixels)   
        
      ⑨   缩略图RGB位图(thumbnail   RGB   bitmap)   
        
      (3)   APPn标记(Markers),其中n=1~15(任选)   
        
      ①   APPn长度(length)   
        
      ②   由于详细信息(application   specific   information)   
        
      (4)   一个或者多个量化表DQT(difine   quantization   table)   
        
      ①   量化表长度(quantization   table   length)   
        
      ②   量化表数目(quantization   table   number)   
        
      ③   量化表(quantization   table)   
        
      (5)   帧图像开始SOF0(Start   of   Frame)   
        
      ①   帧开始长度(start   of   frame   length)   
        
      ②   精度(precision),每个颜色分量每个像素的位数(bits   per   pixel   per   color   component)   
        
      ③   图像高度(image   height)   
        
      ④   图像宽度(image   width)   
        
      ⑤   颜色分量数(number   of   color   components)   
        
      ⑥   对每个颜色分量(for   each   component)   
        
      ID     
      垂直方向的样本因子(vertical   sample   factor)     
      水平方向的样本因子(horizontal   sample   factor)     
      量化表号(quantization   table#)   
      (6)   一个或者多个霍夫曼表DHT(Difine   Huffman   Table)   
        
      ①   霍夫曼表的长度(Huffman   table   length)   
        
      ②   类型、AC或者DC(Type,   AC   or   DC)   
        
      ③   索引(Index)   
        
      ④   位表(bits   table)   
        
      ⑤   值表(value   table)   
        
      (7)   扫描开始SOS(Start   of   Scan)   
        
      ①   扫描开始长度(start   of   scan   length)   
        
      ②   颜色分量数(number   of   color   components)   
        
      ③   每个颜色分量   
        
      ID     
      交流系数表号(AC   table   #)     
      直流系数表号(DC   table   #)   
      ④   压缩图像数据(compressed   image   data)   
        
      (8)   图像结束EOI(End   of   Image)   
        
      表6-06表示了APP0域的详细结构。有兴趣的读者可通过UltraEdit或者PC   TOOLS等工具软件打开一个JPG图像文件,对APP0的结构进行分析和验证。   
        
      表6-06   JFIF格式中APP0域的详细结构   
        
        
      偏移   
        长度   
        内容   
        块的名称   
        说明   
          
      0   
        2   byte   
        0xFFD8   
        (Start   of   Image,SOI)   
        图像开始   
          
      2   
        2   byte   
        0xFFE0   
        APP0(JFIF   application   segment)   
        JFIF应用数据块   
          
      4   
        2   bytes   
            length   of   APP0   block   
        APP0块的长度   
          
      6   
        5   bytes   
            "JFIF"+"0"   
        识别APP0标记   
          
      11   
        1   byte   
            <Major   version>   
        主要版本号(如版本1.02中的1)   
          
      12   
        1   byte   
            <Minor   version>   
        次要版本号(如版本1.02中的02)   
          
      13   
        1   byte   
            <Units   for   the   X   
      and   Y   densities>   
        X和Y的密度单位   
        
      units=0:无单位   
        
      units=1:点数/英寸   
        
      units=2:点数/厘米   
          
      14   
        2   bytes   
            <Xdensity>   
        水平方向像素密度   
          
      16   
        2   bytes   
            <Ydensity>   
        垂直方向像素密度   
          
      18   
        1   byte   
            <Xthumbnail>   
        缩略图水平像素数目   
          
      19   
        1   byte   
            <Ythumbnail>   
        缩略图垂直像素数目   
          
          3n   
            <   Thumbnail   RGB   bitmap>   
        缩略RGB位图(n为缩略图的像素数)   
          
                  Optional   JFIF   extension   APP0   er   segment(s)   
        任选的JFIF扩展APP0标记段   
          
          ……   
            ……   
              
          2   byte   
        0xFFD9   
        (EOI)   end-of-file   
        图像文件结束标记   
    来自GOOGLE然后剩下的问题就是读啦,位置大小格式都有了,读出来看看就行喽