Delphi 在不解码图像的情况下获得JPEG分辨率
我试图在不解码文件的情况下获得JPEG图像的分辨率。我从网上得到了几个样品,但没有一个能正常工作。这似乎是因为许多JPEG文件不是标准的,尽管任何图形应用程序(Irfan、PSP、Firefox等)都可以打开它们 JPEG的标题应该是:Delphi 在不解码图像的情况下获得JPEG分辨率,delphi,jpeg,Delphi,Jpeg,我试图在不解码文件的情况下获得JPEG图像的分辨率。我从网上得到了几个样品,但没有一个能正常工作。这似乎是因为许多JPEG文件不是标准的,尽管任何图形应用程序(Irfan、PSP、Firefox等)都可以打开它们 JPEG的标题应该是: typedef struct _JFIFHeader { BYTE SOI[2]; /* 00h Start of Image Marker */ BYTE APP0[2]; /* 02h Applicati
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字段是错误的。但是,所有图形应用程序都可以读取此非标准文件
有人知道一段Delphi代码,它可以读取所有JPEG文件吗
Delphi 7,Win 7 32位我不知道所有JPEG文件,但您需要处理JPEG的两种常见文件格式。由于JPEG是一种压缩方法,而不是一种文件格式,世界各地都开发了几种将JPEG图像数据存储在文件中的方法。您最可能遇到的两个是JFIF和EXIF。上面的代码包含JFIF,但不处理EXIF。这两个文件在很大程度上是不兼容的,但都是JPEG格式的,因此,如果使用的是头信息,则需要检测并处理它们 例如,对于解决方案。与x/y密度法相比,EXIF的场为x分辨率和y分辨率 我想:
- 如果单位为1,则X密度和Y密度为每英寸点数
- 如果单位为2,则X密度和Y密度为每厘米点数
- 以下是一些代码,可以帮助您获得所需的数据:
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, soFromCurrent);
jpeg.Read(b,1);
end;
end;
end;
end;
函数GetJpegSize(jpeg:TMemoryStream;输出宽度、高度、位深度:整数):布尔值;
var n:整数;
b:字节;
w:单词;
开始
结果:=假;
n:=jpeg.Size-8;
jpeg.位置:=0;
如果n有一个TP/TPW/Delphi(1-4,但可能会一直工作到没有大mods的unicode版本)包,pasjp(e)g可以读取大多数较旧的JPG类型(但不是例如JPEG2000)
FPC也包括这个包
J.Nommsi的原始站点已消失,但该软件包仍然可用,例如