Могу ли я использовать libjpeg для чтения файлов JPEG с альфа-каналом?

Кажется, есть некоторые споры о том, допустимы ли файлы JPEG с альфа-каналами или нет. Я всегда считал правильным ответ , который в FAQ по JPEG , который является по сути «Нет». (Это повторяется в другом вопросе о переполнении стека .)

Однако Java's JPEGImageWriter в библиотеке Sun ImageIO с радостью записывает и считывает изображения в оттенках серого и RGB с альфа-каналом, даже если в Linux, которые я пробовал до сих пор, практически нет приложений, которые могли бы правильно загружать такие файлы JPEG.Раньше об этом сообщалось как об ошибке, но Sun ответила, что это допустимые файлы :

Это не ошибка ввода-вывода изображения, а недостаток других приложений. автор упоминает. IIO JPEGImageWriter может записывать изображения с цветовая модель, содержащая альфа-канал (упоминается в исходном коде IJG исходный код в виде цветовых пространств "NIFTY", таких как RGBA, YCbCrA и т. д.), но многие приложения не знают об этих цветовых пространствах. Итак, хотя эти изображения записанные устройством записи IIO JPEG, соответствуют спецификации JPEG (которая слеп к различным возможностям цветового пространства), некоторые приложения могут не распознавать цветовые пространства, которые содержат альфа-канал и могут вызывать ошибка или рендеринг поврежденного изображения, как описывает отправитель.

Разработчики, желающие сохранить совместимость с этими другими альфа-неизвестными приложения должны писать изображения, не содержащие альфа-канала (например, TYPE_INT_RGB). Разработчики, которым нужна возможность писать / читать изображения содержащий альфа-канал в формате JPEG, можно сделать это с помощью Image I / O API, но нужно знать, что многие собственные приложения не совсем совместимость с форматами YCbCrA и RGBA.

Для получения дополнительной информации см. спецификацию формата метаданных ввода-вывода изображения JPEG и примечания по использованию: http://java.sun.com/j2se/1.4.1/docs/api/javax/imageio/metadata/doc-files/jpeg_metadata.html

Закрытие как «не ошибка». xxxxx @ xxxxx 24-03-2003

Я работаю с Java-приложением, которое создает подобные файлы, и хочу написать код на C, который загрузит их как можно быстрее. (По сути, проблема в том, что библиотека Java ImageIO очень медленно распаковывает эти файлы, и мы хотели бы заменить загрузчик собственным кодом через JNI, который улучшает это - на данный момент это узкое место в производительности.)

Есть некоторые файлы примеров здесь - извинения перед всеми, кто кулрофобно :

Здесь вы можете увидеть результаты попытки просмотра изображений в оттенках серого + альфа и RGB + альфа с помощью различных программ Linux, которые, как мне кажется, используют libjpeg :

изображение в оттенках серого с альфа-каналом. просмотр канала с различными программами http://mythic-beasts.com/~mark/all-alpha-bridges.png

RGB image with alpha channel view with various programs
( источник: отметка на Mythic-beasts.com )

Итак выглядит так, как будто цветовое пространство просто неправильно интерпретируется в каждом случае. Единственные допустимые значения в jpeglib.h :

/* Known color spaces. */

typedef enum {
        JCS_UNKNOWN,            /* error/unspecified */
        JCS_GRAYSCALE,          /* monochrome */
        JCS_RGB,                /* red/green/blue */
        JCS_YCbCr,              /* Y/Cb/Cr (also known as YUV) */
        JCS_CMYK,               /* C/M/Y/K */
        JCS_YCCK                /* Y/Cb/Cr/K */
} J_COLOR_SPACE;

... что не выглядит многообещающим.

Если я загружу эти изображения с немного измененной версией example.c из libjpeg , значения cinfo.jpeg_color_space и cinfo.out_color_space для каждого изображения после чтения заголовка следующие:

gray-normal.jpg: jpeg_color_space is JCS_GRAYSCALE, out_color_space is JCS_GRAYSCALE
gray-alpha.jpg: jpeg_color_space is JCS_CMYK, out_color_space is JCS_CMYK

rgb-normal.jpg: jpeg_color_space is JCS_YCbCr, out_color_space is JCS_RGB
rgb-alpha.jpg: jpeg_color_space is JCS_CMYK, out_color_space is JCS_CMYK

Итак, мои вопросы:

  • Можно ли использовать libjpeg для правильного чтения этих файлов?
  • Если нет, могу ли я использовать альтернативную библиотеку C, которая справится с ними?

Очевидно, есть как минимум два других решения проблемы более общая проблема:

  1. Измените программное обеспечение для вывода обычных файлов JPEG + файл PNG, представляющий альфа-канал
  2. Каким-то образом улучшите производительность Sun ImageIO

... но первое потребует большого количества изменений кода, и Непонятно, как поступить с последним. В любом случае, я думаю, что вопрос о том, как использовать libjpeg для загрузки таких файлов, вероятно, будет одним из более общих интересов.

Любые предложения будут очень признательны.

10
задан Glorfindel 10 August 2019 в 23:48
поделиться