【发布时间】:2008-11-25 12:12:42
【问题描述】:
我需要在 C++ 中获取 JPEG 的图像尺寸。我正在寻找一种相当简单的方法或提供该功能的小型库。我在 OpenVMS 上使用 C++ 工作,因此任何外部库都可能必须适应在我们的系统上编译 - 所以请不要向我发布大型封闭源代码库的链接!
有没有人遇到过任何可以解决问题的方法,或者了解 JPEG 文件格式(我想我可能在这里指的是 JFIF 文件格式)来告诉我如何着手推出自己的解决方案?
【问题讨论】:
我需要在 C++ 中获取 JPEG 的图像尺寸。我正在寻找一种相当简单的方法或提供该功能的小型库。我在 OpenVMS 上使用 C++ 工作,因此任何外部库都可能必须适应在我们的系统上编译 - 所以请不要向我发布大型封闭源代码库的链接!
有没有人遇到过任何可以解决问题的方法,或者了解 JPEG 文件格式(我想我可能在这里指的是 JFIF 文件格式)来告诉我如何着手推出自己的解决方案?
【问题讨论】:
你有这个C function,它可以为你提取相关数据。
这是一个 C 例程,但应该可以用 C++ 编译。
将一个普通的 FILE 指针(来自 fopen)传递给 jpeg 文件的开头,并将两个 int 指针传递给图像的高度和宽度。
或者您可以在Boost library 中找到一个具有正确功能的 jpeg 类(来自Adobe Generic Image Library)。
boost::gil::jpeg_read_dimensions (const char *filename)
返回指定位置的 JPEG 文件的宽度和高度。如果位置不对应于有效的 JPEG 文件,则抛出 std::ios_base::failure。
【讨论】:
libjpeg 相当小,开源并且在 OpenVMS 上可用。安装它可能比自己处理 JPEG 更快。
【讨论】:
也许是libjpeg?
【讨论】:
您应该可以将此jpeg lib 与此patch for OpenVMS 一起使用
【讨论】:
不需要完整的 libjpeg 库来获取这些信息(除非您需要对图像做其他事情)。 ImageInfo 可能会对您有所帮助。它是一个 Java 类,但也有其他语言的端口,包括 C++。
正如所指出的,Exif 可能会更改这些信息(例如,使用方向设置)。
【讨论】:
您可能想尝试GDAL 库,它用作大量栅格数据格式的抽象层,主要用于 GIS/RS 的地理空间应用程序。
GDAL 为 C、C++ 和脚本语言提供了大量的 API。当然,它支持JPEG 图像及其变体,例如JPEG2000 等等。
这是一个非常简单的例子,如何打开JPEG图像并查询其尺寸:
#include <gdal_priv.h>
GDALAllRegister(); // call ones in your application
GDALDataset* ds = (GDALDataset*)GDALOpen("my.jpeg", GA_ReadOnly);
int width = ds->GetRasterXSize();
int height = ds->GetRasterYSize(),
int nbands = ds->GetRasterCount();
查看GDAL API tutorial 以获得更完整的示例。
【讨论】: