обработка JPEG-файлов CMYK в Delphi 7 - PullRequest
1 голос
/ 29 июня 2010

Я пытаюсь получить доступ к файлам, которые хранятся в формате JPEG, есть ли простой способ отобразить эти файлы изображений без потери производительности?

Ответы [ 5 ]

2 голосов
/ 03 декабря 2010

Я нашел эту страницу!

http://cc.embarcadero.com/Item/19723

Усовершенствованная реализация jpeg

Автор: Габриэль Корнеану

Это устройство содержит новыйРеализация jpeg (на основе оригинала Delphi)

  • исправлена ​​ошибка доступа к изображению высотой в один пиксель
  • добавлена ​​поддержка преобразования без потерь для изображений jpeg (на основе библиотеки Thomas G. Lane C - посещение jpegclub.org / jpegtran )
  • добавлена ​​поддержка CMYK (только для чтения)
  • скомпилировано для D5-2010 и BCB5-6-CMYK для быстрого преобразования MMX в RGB (не для Delphi5,отсутствие MMX ASM) (откат к простой паскальской реализации, если она недоступна)
  • исправлена ​​ошибка в Delphi 5 ASM (функция CMYK to 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

2 голосов
/ 30 июня 2010

Вы можете загрузить файл 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);
1 голос
/ 27 февраля 2011

Легко!

Я реализовал преобразование CMYK в JPEG.PAS

Включите его в свой проект для обработки CMYK JPEG

Получить здесь: http://delphi.andreotti.nl/

1 голос
/ 08 июля 2010

На самом деле, я однажды изменил модуль 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);
1 голос
/ 01 июля 2010

Я не верю, что D7 может обрабатывать CMYK JPEG.

Если вы не можете открыть его с помощью модуля JPEG, как опубликовал Ральф, вы можете использовать что-то вроде GDI + для загрузки графического файла.

...