delphi – 在不解码图像的情况下获得JPEG分辨率
发布时间:2020-12-15 04:23:22 所属栏目:大数据 来源:网络整理
导读:我试图在不解码文件的情况下获得JPEG图像的分辨率.我从互联网上得到了几个样本但没有一个正常工作.这似乎是这种方式,因为许多JPEG文件不是标准的,但任何图形应用程序(Irfan,PSP,Firefox等)都可以打开它们. JPEG的标题应该是: typedef struct _JFIFHeader{ B
我试图在不解码文件的情况下获得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; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |