Краткая версия: есть ли простой способ узнать, является ли файл JPG CMYK или RGB в Delphi XE? Желательно без дополнительных библиотек ...
Более длинная версия: у меня есть сторонняя библиотека, которая принимает JPEG. Но по какой-то причине библиотеке необходимо знать, находятся ли они в цветовом пространстве CMYK или RGB. И что еще хуже, он отображает CMYK с неправильными цветами (возможно, что-то с CMS или около того ...). Сам Delphi (TJPEGImage) правильно отображает изображение CMYK, но кажется, что все «CMYK vs RGB» скрыто в разделе реализации jpeg.pas и не публикуется ...
Я искал много чего в Интернете, но здесь я нашел только сообщения нескольких лет назад. Также я нашел модифицированный файл jpeg.dcu Габриэля Корнеану, но все дело в том, чтобы Delphi правильно загружала изображение. И кажется, что XE правильно загружает CMYK JPEG.
В конце концов, я бы предпочел преобразовать изображение CMYK в RGB, и хотя это звучит ужасно, я не возражаю сделать это путем перекодирования JPEG (если нет другого лучшего варианта). В основном загружайте его в растровое изображение и при необходимости сохраняйте растровое изображение как JPEG ...
P.S. Я хотел бы по возможности избегать добавления других библиотек в свой проект, и я хотел бы оставаться в рамках "стандартного Delphi", насколько это возможно, поэтому, если мне когда-либо понадобится перенести этот проект на Mac, iOS или Android, мне не нужно иметь дело с множеством внешних вещей ...
2 ответа
Мы сузили количество решений до трех:
- Самостоятельно разбирать JPEG - это кажется рискованным
- Слегка измените jpeg.pas Delphi (измените имя класса и предоставьте информацию CMYK) - это кажется жизнеспособным вариантом, но мы не уверены, соответствует ли он авторским правам, и поскольку jpeg.pas активно использует много OBJ, это может доказать невозможно использовать на других платформах в будущем
- Используйте стороннюю библиотеку, мы нашли NativeJPG http://www.simdesign.nl/nativejpg.html a> и, похоже, он неплохо справляется со своей задачей, и он должен быть написан на чистом Паскале, поэтому мы думаем, что есть довольно хороший шанс, что при необходимости его можно будет легко перенести на другие платформы.
Простой способ, который, вероятно, будет работать почти всегда, - это поиск изображений маркера SOF (начало кадра).
Если этот маркер имеет 1 компонент, изображение в оттенках серого; если он состоит из 3 компонентов, скорее всего, это будет YCbCr; а если он состоит из 4 компонентов, скорее всего, это будет CMYK.
Если вам нужен более надежный метод, вам нужно будет определить формат файла JPEG. Для этого вы должны прочитать маркеры APPn. Оттуда обработка будет зависеть от типа найденного файла.
Похожие вопросы
Связанные вопросы
Новые вопросы
delphi
Delphi - это язык для быстрой разработки собственных приложений для Windows, macOS, Linux, iOS и Android с использованием Object Pascal. Название относится к языку Delphi, а также к его библиотекам, компилятору и IDE, которые используются для помощи в редактировании и отладке проектов Delphi.
TJpegImage.IsCMYK
. но я не уверен, подходит ли он для delphi-xeAssigned(FBitmap) and (FBitmap.PixelFormat = pf32bit)
. Помощник класса прислушался, оф.