我试图在不解码文件的情况下获得JPEG图像的分辨率.我从互联网上得到了几个样本但没有一个正常工作.这似乎是这种方式,因为许多JPEG文件不是标准的,但任何图形应用程序(Irfan,PSP,Firefox等)都可以打开它们.
JPEG的标题应该是:
typedef struct _JFIFHeader { BYTE SOI[2]; /* 00h Start of Image Marker */ BYTE APP0[2]; /* 02h Application Use Marker */ BYTE Length[2]; /* 04h Length of APP0 Field */ BYTE Identifier[5]; /* 06h "JFIF" (zero terminated) Id String */ BYTE Version[2]; /* 07h JFIF Format Revision */ BYTE Units; /* 09h Units used for Resolution */ BYTE Xdensity[2]; /* 0Ah Horizontal Resolution */ BYTE Ydensity[2]; /* 0Ch Vertical Resolution */ BYTE XThumbnail; /* 0Eh Horizontal Pixel Count */ BYTE YThumbnail; /* 0Fh Vertical Pixel Count */ } JFIFHEAD;
但是,当我查看其中一个非标准文件时,Xdensity和Ydensity字段是错误的.但同样,所有图形应用程序都可以读取此非标准文件.
有人知道一段可以实际读取所有JPEG文件的Delphi代码吗?
Delphi 7,Win 7 32位
解决方法
以下是一些可以帮助您获取所需数据的代码:
function GetJpegSize(jpeg: TMemoryStream; out width,height,BitDepth: integer): boolean; var n: integer; b: byte; w: Word; begin result := false; n := jpeg.Size-8; jpeg.Position := 0; if n<=0 then exit; jpeg.Read(w,2); if w<>$D8FF then exit; // invalid format jpeg.Read(b,1); while (jpeg.Position<n) and (b=$FF) do begin jpeg.Read(b,1); case b of $C0..$C3: begin jpeg.Seek(3,soFromCurrent); jpeg.Read(w,2); height := swap(w); jpeg.Read(w,2); width := swap(w); jpeg.Read(b,1); BitDepth := b*8; Result := true; // JPEG format OK exit; end; $FF: jpeg.Read(b,1); $D0..$D9,$01: begin jpeg.Seek(1,soFromCurrent); jpeg.Read(b,1); end; else begin jpeg.Read(w,2); jpeg.Seek(swap(w)-2,1); end; end; end; end;