gpt4 book ai didi

c - 如何在不使用库的情况下获取 jpeg 文件的宽度/高度?

转载 作者:太空狗 更新时间:2023-10-29 16:58:11 24 4
gpt4 key购买 nike

首先我想说我尝试了很多次使用谷歌搜索找到答案,我找到了很多结果但我不明白,因为我不知道读取二进制文件并将值转换的想法获得可读值。

我尝试这样做。

unsigned char fbuff[16];
FILE *file;
file = fopen("C:\\loser.jpg", "rb");
if(file != NULL){
fseek(file, 0, SEEK_SET);
fread(fbuff, 1, 16, file);
printf("%d\n", fbuff[1]);
fclose(file);
}else{
printf("File does not exists.");
}

我想要一个简单的示例说明,如何从文件头获取 jpeg 文件的宽度/高度,然后将该值转换为可读值。

最佳答案

不幸的是,JPEG 似乎并不简单。您应该查看 jhead 的来源命令行工具。它提供了这些信息。浏览源代码时,您会看到函数 ReadJpegSections。此功能扫描 JPEG 文件中包含的所有片段以提取所需信息。图像的宽度和高度是在处理具有SOFn 标记的帧时获得的。

我看到来源在公共(public)领域,所以我将展示获取图像信息的片段:

static int Get16m(const void * Short)
{
return (((uchar *)Short)[0] << 8) | ((uchar *)Short)[1];
}

static void process_SOFn (const uchar * Data, int marker)
{
int data_precision, num_components;

data_precision = Data[2];
ImageInfo.Height = Get16m(Data+3);
ImageInfo.Width = Get16m(Data+5);

从源代码中,我很清楚这些信息没有单独的“ header ”。您必须扫描 JPEG 文件,解析每个片段,直到找到包含所需信息的片段。这在 wikipedia article 中有描述。 :

A JPEG image consists of a sequence of segments, each beginning with a marker, each of which begins with a 0xFF byte followed by a byte indicating what kind of marker it is. Some markers consist of just those two bytes; others are followed by two bytes indicating the length of marker-specific payload data that follows.


JPEG 文件由一系列片段组成:

SEGMENT_0
SEGMENT_1
SEGMENT_2
...

每个段都以一个 2 字节的标记开始。第一个字节是0xFF,第二个字节决定了段的类型。随后是段长度的编码。段内是特定于该段类型的数据。

图像的宽度和高度位于 SOFn 类型的片段中,或“帧开始 [n]”,其中“n”是一些数字,对 JPEG 解码器来说具有特殊意义。只查找 SOF0 应该就足够了,它的字节指定是 0xC0。找到此帧后,您可以对其进行解码以找到图像的高度和宽度。

因此,执行您想要的操作的程序结构如下所示:

file_data = the data in the file
data = &file_data[0]
while (data not at end of file_data)
segment_type = decoded JPEG segment type at data
if (type != SOF0)
data += byte length for segment_type
continue
else
get image height and width from segment
return

这基本上是在 Michael Petrov's get_jpeg_size() implementation 中找到的结构.

关于c - 如何在不使用库的情况下获取 jpeg 文件的宽度/高度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18264357/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com