Обработка 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+ для загрузки графического файла.

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