Получить размеры JPEG в C++

Мне нужно получить размеры изображения JPEG на C++. Я ищу либо довольно простой способ сделать это, либо небольшую библиотеку, которая предоставляет эту функциональность. Я работаю на C++ над OpenVMS, поэтому любые внешние библиотеки, возможно, придется адаптировать для компиляции в наших системах - поэтому, пожалуйста, не размещайте мне ссылки на большие библиотеки с закрытым исходным кодом!

Кто-нибудь сталкивался с чем-то, что могло бы помочь или понять формат файла JPEG (я думаю, я, вероятно, имею в виду формат файла JFIF здесь), чтобы сказать мне, как я могу сделать свое собственное решение?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
5
0
8 136
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Может libjpeg?

Ответ принят как подходящий

У вас есть этот Функция C, который может извлекать для вас соответствующие данные.

This is a C routine but should compile fine with C++.
Pass it a normal FILE pointer (from fopen) to the beginning of a jpeg file and two int pointers to be set with the image height and width.

Или вы можете найти в Библиотека Boost класс jpeg, который имеет правильную функцию (из AdobeУниверсальная библиотека изображений).

jpeg_read_dimensions

boost::gil::jpeg_read_dimensions (const char *filename)

Returns the width and height of the JPEG file at the specified location. Throws std::ios_base::failure if the location does not correspond to a valid JPEG file.

Извините за опоздание - просто исчез, чтобы жениться! Снова за свой стол :-(. Я выбрал процедуру C (хотя #defines вверху УЖАСНО - переписал их как функции).

Dominic Rodger 16.12.2008 15:40

Поздравляю вас обоих!

VonC 16.12.2008 15:43

return Many Happy return Many Happy!

EvilTeach 13.01.2009 21:18

@VonC первая ссылка мертва, а вот другая, выглядит так же? carnage-melon.tom7.org/stuff/jpegsize.html

Ben 09.11.2012 04:09

@ Стив Спасибо. Первая ссылка исправлена.

VonC 09.11.2012 11:00

Вы должны иметь возможность использовать этот jpeg lib с этим патч для OpenVMS

libjpeg - это достаточно маленький файл с открытым исходным кодом, доступный на OpenVMS. Вероятно, установить его быстрее, чем обрабатывать JPEG самостоятельно.

Нет необходимости в полной библиотеке libjpeg только для получения этой информации (если вам не нужно делать что-то еще с изображениями). ImageInfo может вам помочь. Это класс Java, но есть порты и для других языков, включая C++.
Как уже отмечалось, Exif может изменить эту информацию (например, с помощью настройки ориентации).

Вы можете попробовать библиотеку ГДАЛ, которая служит уровнем абстракции для большого количества форматов растровых данных, в основном используемых в геопространственных приложениях для ГИС / ДЗ.

GDAL предоставляет ряд API для C, C++ и языков сценариев. Конечно, он поддерживает изображения 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 для более полного примера.

Другие вопросы по теме