Кажется, есть некоторые споры о том, допустимы ли файлы 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
:
( источник: отметка на 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
для загрузки таких файлов, вероятно, будет одним из более общих интересов.
Любые предложения будут очень признательны.