怎样判断一个文件是为BMP文件还是JPG文件?解决思路

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

------解决方案--------------------
不清楚Delphi的语法,给你断VB的代码,是通过读文件方式来获取的


Public Enum ImageFormatEnum
Bmp = 0
JPG = 1
GIF = 2
PNG = 3
WMF = 4
Other = 5
End Enum

Private 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了。
------解决方案--------------------
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
....
...
------解决方案--------------------
bmp文件头字节是“BM”

或者:
var
_type:word;
begin
stream.ReadBuffer(_type,sizeof(word));//stream 是你读的流它的前2个字节保存的是图类型
case _type of
0: ; //取出的是 ico
55551:;//取出的是jpg
19778:;//取出的是bmp
end ;
------解决方案--------------------
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个部分组成: