我试图在不解码文件的情况下获得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;
原文地址:https://www.jb51.cc/delphi/101691.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。