gpt4 book ai didi

c++ - 如何在不加载完整文件的情况下检查文件是否是图像?有没有图片头读取库?

转载 作者:搜寻专家 更新时间:2023-10-31 00:05:36 24 4
gpt4 key购买 nike

编辑:

抱歉,我想我的问题含糊不清。我希望有一种方法可以在不浪费时间加载整个图像的情况下检查文件是否 是图像,因为这样我可以稍后再进行其余的加载。我不想只检查文件扩展名。

应用程序只查看图像。通过“检查有效性”,我的意思是“检测并跳过目录中的非图像文件”。如果像素数据已损坏,我仍希望将其视为图像。

我分配页码并将这些图像配对。有些图像是单个左页或右页。有些图像很宽,是左右页面的“跨页”。例如,pagesAt(3) 和 pagesAt(4) 可以返回相同的 std::pair 图像或相同宽图像的 std::pair。

有时,会有奇数个“薄”图像,第一张图像将单独显示,类似于宽图像。一个例子是单个封面。

不知道目录中的哪些文件是非图像意味着我无法自信地分配这些页码并将文件配对以进行显示。此外,用户可能决定跳转到第 X 页,而当我稍后发现并删除一个非图像文件并相应地重新分配页码时,第 X 页可能会显示为不同的图像。

原创:

以防万一,我使用的是 Qt 库中的 c++ 和 QImage。

我正在遍历目录并在图像路径上使用 QImage 构造函数。当然,这非常慢,并且使应用程序感觉 react 迟钝。但是,它确实允许我检测无效的图像文件并尽早忽略它们。

我可以在遍历目录时只保存图像的路径,实际上只在需要时加载它们,但那样我就不知道图像是否无效。

我正在考虑将这两者结合起来。即,在遍历目录时,仅读取图像的标题以检查有效性,然后在需要时加载图像数据。

所以,

只加载图像标题是否比加载整个图像快得多?或者做一些 i/o 来读取标题意味着我还不如完成完整加载图像?稍后,我还将解压缩存档中的图像,因此这也适用于仅解压缩 header 与解压缩整个文件。

此外,我不知道如何加载/读取只是图像标题。有没有可以只读取图像标题的库?否则,我必须自己将每个文件作为流打开,并为所有文件类型的图像标题阅读器编写代码。

最佳答案

Unix file 工具(几乎一直存在)就是这样做的。它是一个简单的工具,使用已知文件头和二进制签名的数据库来识别文件类型(并可能提取一些简单信息)。

数据库是一个简单的文本文件(为提高效率而编译),它使用简单的结构化格式(在 man magic 中记录)描述了大量的二进制文件格式。源代码位于 /usr/share/file/magic(在 Ubuntu 中)。例如,PNG 文件格式的条目如下所示:

0       string          \x89PNG\x0d\x0a\x1a\x0a         PNG image
!:mime image/png
>16 belong x \b, %ld x
>20 belong x %ld,
>24 byte x %d-bit
>25 byte 0 grayscale,
>25 byte 2 \b/color RGB,
>25 byte 3 colormap,
>25 byte 4 gray+alpha,
>25 byte 6 \b/color RGBA,
>28 byte 0 non-interlaced
>28 byte 1 interlaced

您可以只提取图像文件类型的签名,并构建您自己的“嗅探器”,甚至可以使用 file 工具(似乎是 BSD 许可)中的解析器。

关于c++ - 如何在不加载完整文件的情况下检查文件是否是图像?有没有图片头读取库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1981286/

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