不清楚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了。
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个部分组成:
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了。
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
....
...
var
_type:word;
begin
stream.ReadBuffer(_type,sizeof(word));//stream 是你读的流它的前2个字节保存的是图类型
case _type of
0: ; //取出的是 ico
55551:;//取出的是jpg
19778:;//取出的是bmp
end ;
一个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然后剩下的问题就是读啦,位置大小格式都有了,读出来看看就行喽