Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 在不解码图像的情况下获得JPEG分辨率_Delphi_Jpeg - Fatal编程技术网

Delphi 在不解码图像的情况下获得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

我试图在不解码文件的情况下获得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字段是错误的。但是,所有图形应用程序都可以读取此非标准文件

有人知道一段Delphi代码,它可以读取所有JPEG文件吗



Delphi 7,Win 7 32位

我不知道所有JPEG文件,但您需要处理JPEG的两种常见文件格式。由于JPEG是一种压缩方法,而不是一种文件格式,世界各地都开发了几种将JPEG图像数据存储在文件中的方法。您最可能遇到的两个是JFIF和EXIF。上面的代码包含JFIF,但不处理EXIF。这两个文件在很大程度上是不兼容的,但都是JPEG格式的,因此,如果使用的是头信息,则需要检测并处理它们

例如,对于解决方案。与x/y密度法相比,EXIF的场为x分辨率y分辨率

我想:

  • 阅读两种格式(JFIF和EXIF)。我发现 维基百科是一个很好的起点 关于此参考(对于某些过去 我做过的项目),但大多数 可能有一些很好的信息 话题也一样

    JFIF:

    进出口银行:

  • 编写代码以使用起始标头检测格式

  • 独立处理每种格式

  • 包装整个东西,这样你就可以扔一个JPEG在它和得到 密度。这还将为您提供一个很好的位置,让您可以使用其他帮助程序代码来处理JPEG处理的“有趣”世界

  • JPEG文件头的Units、Xdensity和Ydensity成员指定打印文件时用于描述物理点密度的度量单位

    • 如果单位为1,则X密度和Y密度为每英寸点数
    • 如果单位为2,则X密度和Y密度为每厘米点数
    关键是存储在图像文件中的点分辨率(缩放打印分辨率)在屏幕上根本不重要。因此,Windows程序将始终在屏幕上为任何文件显示96个逻辑ppi。注意,有些应用程序更喜欢使用72逻辑ppi在屏幕上显示图片,例如Adobe应用程序

    当AcDee、Adobe PS图象处理软件、CalelDRAW等图形应用程序在屏幕上显示JPG文件时,简单地忽略单元、XStand和Yn密度成员,但如果存在JPG文件,则图形应用程序会考虑这些成员的值。如果JPG文件没有Units、Xdensity和Ydensity成员,图形应用程序将使用其自定义默认值(通常为150 dpi)打印JPG文件

    因此,对于可以读取所有JPEG头文件的Delphi代码的问题,答案很简单,只需读取JPG头文件信息;如果文件中不存在可选成员,只需忽略可选成员或告诉最终用户当前未在文件中指定它们

    关于DPI和PPI混淆的进一步阅读
    关于JPEG文件格式规范的参考

      • 以下是一些代码,可以帮助您获得所需的数据:

        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的原始站点已消失,但该软件包仍然可用,例如