要从JFIF / EXIF(JPEG)标头获得实际的图像分辨率吗?

问题描述 投票:4回答:1

我创建了一个C ++结构,用于读取和验证JFIF文件格式的标头。结构如下...

#pragma pack(1)
typedef struct _JFIF_Header
{
    WORD SOIMarker;         // start of image marker
    WORD APP0_Marker;       // Application use marker
    WORD APP0_Length;       // Length of APP0 field
    BYTE Identifier[5];     // zero terminating string "JFIF",X'4A', X'46', X'49', X'46', X'00'
    BYTE Version[2];        // X'01',X'02'
    BYTE Units;             // units = 0:no units ;; units = 1:X and Y are dots per inch ;; units = 2:X and Y are dots per cm
    WORD XDensity;          // horizontal pixel density
    WORD YDensity;          // vertical pixel density
    BYTE XThumbnail;        // Thumbnail horizontal pixel density
    BYTE YThumbnail;        // Thumbnail vertical pixel density
}JFIFHeader;

从原始磁盘群集读取并在JFIFHeader结构中复制这些字节已完成,并且一切正常。现在的问题是,保存在XDensityYDensity变量中的值非常高(X:24576,Y:24576我在十六进制编辑器中读取图像)。该值不能是图像的实际宽度和高度。Units的值为0x01,即单位为“每英寸像素数”。

如何从这些值中获得实际的图像分辨率1024x826?如果这不是正确的方法,请给我其他选择。

c++ c header jpeg resolution
1个回答
6
投票

您可以找到JPEG的SOF0标记(0xC0),然后是16位长度,然后是每个像素的位(8位),高度(16位),宽度(16位)和组件数(8位)。所有值都是网络字节顺序。

<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS96aXN2Sy5wbmcifQ==” alt =“在此处输入图像描述”>

[图像是0x1C2 x 0x1C2像素(450x450)。

© www.soinside.com 2019 - 2024. All rights reserved.