内存流判断图片格式
注意:
1.下载个“C32asm”或者“UE"等这类16进制编辑器可以查看图片格式。
2.只是简单的判断文件的前2个字节,如果想更加精确一点的话,可以把文件最后2个字节也判断上。
3.有朋友发现,前几字节用的正是"bmp""jpg""png"等的ASCII码。
实例代码:
1 unit Unit1; 2 3 interface 4 5 uses 6 Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, 7 Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; 8 9 type 10 TForm1 = class(TForm) 11 Button1: TButton; 12 OpenDialog1: TOpenDialog; 13 procedure Button1Click(Sender: TObject); 14 private 15 { Private declarations } 16 public 17 { Public declarations } 18 end; 19 20 var 21 Form1: TForm1; 22 23 implementation 24 25 {$R *.dfm} 26 27 //Button1的单击事件 28 procedure TForm1.Button1Click(Sender: TObject); 29 var 30 MyImage: TMemoryStream;//内存流对象 31 Buffer:Word; 32 i:integer; 33 begin 34 //OpenDialog1是一个文件打开对话框,在Delphi组件面版的Dialog页中可以找到。 35 if OpenDialog1.Execute then 36 begin 37 MyImage:=TMemoryStream.Create; //建立内存流对象 38 try 39 MyImage.LoadFromFile(OpenDialog1.FileName); //把刚刚用户选择的文件载入到内存流中 40 MyImage.Position := 0; //移动指针到最开头的位置 41 if MyImage.Size = 0 then //如果文件大小等于0,那么 42 begin 43 //错误 44 ShowMessage('错误'); 45 Exit; 46 end; 47 MyImage.ReadBuffer(Buffer,2); //读取文件的前2个字节,放到Buffer里面 48 49 if Buffer=$4D42 then //如果前两个字节是以4D42[低位到高位] 50 begin 51 ShowMessage('BMP'); //那么这个是BMP格式的文件 52 end 53 else if Buffer=$D8FF then //如果前两个字节是以D8FF[低位到高位] 54 begin 55 //JPEG 56 ShowMessage('JPEG'); //........一样 下面不注释了 57 end 58 else if Buffer=$4947 then 59 begin 60 //GIF 61 ShowMessage('GIF'); 62 end 63 else if Buffer=$050A then 64 begin 65 //PCX 66 ShowMessage('PCX'); 67 end 68 else if Buffer=$5089 then 69 begin 70 //PNG 71 ShowMessage('PNG'); 72 end 73 else if Buffer=$4238 then 74 begin 75 //PSD 76 ShowMessage('PSD'); 77 end 78 else if Buffer=$A659 then 79 begin 80 //RAS 81 ShowMessage('RAS'); 82 end 83 else if Buffer=$DA01 then 84 begin 85 //SGI 86 ShowMessage('SGI'); 87 end 88 else if Buffer=$4949 then 89 begin 90 //TIFF 91 ShowMessage('TIFF'); 92 end 93 else //如是其他类型的文件的话,直接显示错误 94 begin 95 //ERR 96 ShowMessage('ERR'); 97 end; //if 98 finally 99 MyImage.Free; //释放内存流对象 100 end; 101 end; 102 end; 103 104 end.