Обработка JPEG-файлов CMYK в Delphi 7
Я пытаюсь получить доступ к файлам, которые хранятся в формате JPEG, есть ли простой способ отобразить эти файлы изображений без потери производительности?
5 ответов
Я нашел эту страницу!
http://cc.embarcadero.com/Item/19723
Улучшенная реализация JPEG
Автор: Габриэль Корнеану
Этот модуль содержит новую реализацию JPEG (на основе оригинального Delphi)
- исправлена ошибка доступа к изображению высотой в один пиксель
- добавлена поддержка преобразования без потерь для изображений JPEG (на основе библиотеки Thomas G. Lane C - посетите страницу http://jpegclub.org/jpegtran)
- добавлена поддержка CMYK (только для чтения)
- скомпилировано для быстрого преобразования MMX D5-2010 и BCB5-6-CMYK в RGB (не для Delphi5, отсутствие MMX ASM) (откат к простой паскальской реализации, если она недоступна)
- исправлена ошибка в Delphi 5 ASM (функция CMYK для RGB)
Вам нужен только файл jpeg.dcu; его можно скопировать в программный каталог или в каталог LIB. Я также сгенерировал файлы obj и hpp для использования с CBuilder 5 и 6. Вот что вам нужно для этого:
Это просто перечисление
TJpegTransform = (
jt_FLIP_H, { horizontal flip }
jt_FLIP_V, { vertical flip }
jt_TRANSPOSE, { transpose across UL-to-LR axis }
jt_TRANSVERSE, { transpose across UR-to-LL axis }
jt_ROT_90, { 90-degree clockwise rotation }
jt_ROT_180, { 180-degree rotation }
jt_ROT_270 { 270-degree clockwise (or 90 ccw) }
);
procedure Crop(xoffs, yoffs, newwidth, newheight: integer);
этот метод обрезает изображение
procedure Transform(Operation: TJpegTransform);
этот метод применяет указанное преобразование; Прочитайте комментарии transupp.h об ограничениях (мой код использует параметр обрезки)
property IsCMYK: boolean read FIsCMYK;
это будет указывать, если последнее загруженное изображение JPEG в кодировке CMYK
property InverseCMYK: boolean read FInverseCMYK write SetInverseCMYK;
если установлено (по умолчанию, потому что я мог только найти этот вид изображений), изображение CMYK декодируется с инвертированными значениями CMYK (я читал, что Photoshop делает это).
Jpegex - это то же самое устройство, скомпилированное с другим именем. Его можно использовать, чтобы избежать конфликтов, когда у вас есть другие компоненты без ссылки на исходный код исходного модуля jpeg. В этом случае вам может понадобиться использовать квалифицированные имена классов для разрешения конфликта имен: jpegex.TJpegImage.xxx. Будьте осторожны, когда используете обе версии в одной программе: даже если у классов одинаковое имя, они не идентичны, и вы не можете разыграть или назначить их напрямую. Единственный способ обмена данными - это сохранение / загрузка из потока.
Отправить комментарии: gabrielcorneanuATyahooDOTcom
Вы можете загрузить файл JPeg, используя экземпляр TJPEGImage, а затем назначить его для отображения TBitmap. Вы найдете TJPEGImage в блоке JPEG.
jpeg := TJPEGImage.Create;
jpeg.LoadFromFile('filename.jpg');
bitm := TBitmap.Create;
bitm.Assign(jpeg);
Image1.Height := bitm.Height;
Image1.Width := bitm.Width;
Image1.Canvas.Draw(0, 0, bitm);
В качестве альтернативы, это также должно работать:
bitm := TBitmap.Create;
bitm.Assign('filename.jpg');
Image1.Height := bitm.Height;
Image1.Width := bitm.Width;
Image1.Canvas.Draw(0, 0, bitm);
Легко!
Я реализовал преобразование CMYK в JPEG.PAS
Включите его в свой проект для обработки CMYK JPEG
Получите это здесь: http://delphi.andreotti.nl/
На самом деле, я однажды изменил модуль Jpeg.pas для частичной поддержки CMYK. В основном после
jpeg_start_decompress(jc.d)
ты должен проверить
if jc.d.out_color_space = JCS_CMYK then
и если true, то jpeg_read_scanlines получит 4 байта данных вместо 3 байтов.
Также cinfo.saw_Adobe_marker указывает инвертированные значения (вероятно, Adobe была первой, кто ввел вариацию CMYK jpeg).
Но самой сложной частью является преобразование CMYK-RGB. Поскольку универсальной формулы не существует, в лучших системах это всегда настольный подход. Я пытался найти простое приближение, но всегда есть изображение, которое не подходит. Просто в качестве примера, не используйте эти формулы в качестве ссылки:
R_:=Max(254 - (111*C + 2*M + 7*Y + 36*K) div 128, 0);
G_:=Max(254 - (30*C + 87*M + 15*Y + 30*K) div 128, 0);
B_:=Max(254 - (15*C + 44*M + 80*Y + 24*K) div 128, 0);
Я не верю, что D7 может справиться с CMYK JPEG.
Если вы не можете открыть его с помощью модуля JPEG, как опубликовал Ральф, вы можете рассмотреть возможность использования чего-то вроде GDI+ для загрузки графического файла.