Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Звук, графика и видео > Определить BPP для JPEG


Автор: Alexeyt 7.3.2008, 07:41
Hi

Как определить число цветов (bpp, bits per px)
для Jpeg?
Используется Jpeg (стандартный модуль)


Автор: Alexeis 7.3.2008, 11:01
Юзаем Интел Jpeg (ijl.pas)
Код

procedure TForm1.FormCreate(Sender: TObject);
var
  jph : TJPEG_CORE_PROPERTIES;
begin
  FillChar(jph, SizeOf(TJPEG_CORE_PROPERTIES), 0);
  ijlInit(@jph);
  jph.JPGFile := PChar('1.jpg');
  ijlRead(@jph, IJL_JFILE_READPARAMS);
end;

Все что нужно есть в jph.

Автор: Alexeyt 7.3.2008, 11:18
Спасибо, +1

А без IJL -нельзя?
А то брать ijl15.dll не хочется, размер программы вырастет, и из-за ничего - из-за простого чтения BPP файла...

Автор: Alexeis 7.3.2008, 11:48
Цитата(Alexeyt @  7.3.2008,  10:18 Найти цитируемый пост)
А без IJL -нельзя?

  Можно, но сложнее. Где-то тут есть темка про чтение размеров жпеги вручную. Вроде я там довел до ума алогоритм поиска структуры-описания jpeg. На самом деле в той структуре помимо  высоты и ширины есть еще кой какие данные. 
  
  Однако если нужно отображать jpegу то я советую отказаться от борландовского jpeg-a. Он не универсальный (отображает не все правильные картинки) + искажения вносимые им при распаковке больше чем у Intel Jpeg. Тут еще есть возможность доставания превьюшек из jpeg-a (обычно фотоаппараты запихивают в жпегу еще и их).

Добавлено через 12 минут и 13 секунд
http://forum.vingrad.ru/index.php?show_type=forum&showtopic=105564

Значит в том сегменте есть следующая инфа
Цитата

SOF0: Начало Кадра 0:
    * $ff, $c0 (SOF0)
    * длина (старший байт, младший байт), 8+components*3
    * точность данных (1 байт) в битах/единицу, обычно 8 (12 и 16 не поддерживается большинством программного обеспечения)
    * высота изображения (2 байта, High-Low), должно быть >0, если DNL не поддерживается
    * ширина изображения (2 байта, High-Low), должно быть >0, если DNL не поддерживается
    * количество компонентов (1 байт), обычно 1 = черно-белый, 3 = цвет YCbCr или YIQ, 4 = цвет CMYK)
    * для каждого компонента: 3 байта

    * идентификатор компонента (1 = Y, 2 = Cb, 3 = Cr, 4 = I, 5 = Q)
    * показатели дискретизации (бит 0-3 вертикальной, 4-7 горизонтальной)
    * номер таблицы квантования


  Т.е. дополнительно можно достать еще bpp.

Для того чтобы достать разрешение в точках/дюйм нужно будет еще дополнительно найти блок
Цитата

APP0: JFIF маркер сегмента:

    * $ff, $e0 (APP0)
    * длина (старший байт, младший байт), должна быть >= 16
    * 'JFIF'#0 ($4a, $46, $49, $46, $00), идентифицирует JFIF
    * номер общей версии, должен быть 1 (в противном случае ошибка)
    * номер подверсии, должен быть 0..2 (в противном случае попытка декодирования по-другому)
    * единица для x/y разрешения:

0 = нет никаких единиц, x/y-отношение определяет соотношение аспекта

1 = x/y-разрешение в точках/дюйм

2 = x/y-разрешение в точках/сантиметр

    * x-разрешение (старший байт, младший байт), должно быть <> 0
    * y-разрешение (старший байт, младший байт), должно быть <> 0
    * ширина предварительного просмотра (1 байт)
    * высота предварительного просмотра (1 байт)
    * n байт для предварительного просмотра (RGB 24 бит) n = ширина*высота*3


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)