Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: GIF
 
 автор: Unkind   (27.05.2007 в 13:00)   письмо автору
 
 

Хочу выдрать глобальную палитру из GIF-картинки. Пользуюсь этой информацией: http://home.onego.ru/~chiezo/gif.htm#gct

После дескриптора логического экрана должна следовать (если CT == 1) эта глобальная палитра до символа "," (запятая). Она должна иметь формат RGB, и по идее тогда количество байт, которая занимает эта палитра должно быть кратно трем. Но у меня выходит не так.
Начинаю считывать с 14-ого байта (дескриптор лог. экрана занимает 13 байт) по 3 байта:
[R][G][B]
[R][G][B]
...
[R][G][B]
[R][G],

Запятая оказывается не там, где надо. Что я не так делаю?

   
 
 автор: sim5   (27.05.2007 в 14:10)   письмо автору
 
   для: Unkind   (27.05.2007 в 13:00)
 

Поле SIZE дескриптора лог. экрана содержит размер глобальной плитры, и согласно приведенной таблицы, получается что складывается из ее размера плюс числа цветов. Проверял на картинках - при size = 3, до запятой получается 48 байт палитры, плюс 16 бат цветов. Вот так видимо надо считать.

   
 
 автор: Trianon   (27.05.2007 в 14:40)   письмо автору
 
   для: sim5   (27.05.2007 в 14:10)
 

Поле SIZE содержит не сам размер, а его сдвиг.

число цветов равно 1<<(SIZE+1),
А число байт таблицы цветов = 3 <<(SIZE+1).
Eсли SIZE = 3, это значит, что число цветов = 1<<4 = 16,
Что соответствует 48 байтам таблицы.

   
 
 автор: sim5   (27.05.2007 в 14:44)   письмо автору
 
   для: Trianon   (27.05.2007 в 14:40)
 

если, принять во внимание только это - 48 байт, то до запятой никак не получается.
Но при 5, никак не получается и 256 до запятой.

   
 
 автор: Unkind   (27.05.2007 в 16:07)   письмо автору
 
   для: sim5   (27.05.2007 в 14:44)
 


<?php
set_time_limit
(1);

header("Content-type: text/plain; charset=windows-1251");
header("Last-Modified: " gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-cache, must-relative");

$fh fopen("picture.gif""rb");
fseek($fh10SEEK_SET);
$size bindec(substr(decbin(ord(fread($fh1))), 6));

fseek($fh13SEEK_SET);

for(
$i 0$i < (<< ($size 1)) * 3$i += 3)
{
$rgb fread($fh3);

echo(
ord($rgb[0]) . "." ord($rgb[1]) . "." ord($rgb[2]) . "\r\n");
}

//Следующий знак должен быть ",":
echo(fread($fh1999)); //Но нет, это не запятая, а chr(0)

fclose($fh);
?>


Запятая вообще еще довольно далеко. Что-то не то...

   
 
 автор: Trianon   (27.05.2007 в 17:00)   письмо автору
 
   для: Unkind   (27.05.2007 в 16:07)
 

Ребята, какая запятая, вы о чем вообще?
GIF-формат основан на бинарном потоке, не на текстовом.
Я сюда как-то свой парсер клал, можно попробовать найти.
Он парсил всё вплоть до уровня LZW-данных.

UPD. http://softtime.ru/forum/read.php?id_forum=1&id_theme=13137

   
 
 автор: sim5   (27.05.2007 в 17:08)   письмо автору
 
   для: Trianon   (27.05.2007 в 17:00)
 

Признак начала картинки в GIF - 2C.
Если смотреть HEX-редактором картинку, то исходя из условия что SIZE это 3*число цветов,
то до первого 2С в HEX-коде никак не получается.

P.S. Вот например:

47494638396120002000B30800000000
80000000800080800000008080008000
8080808080C0C0C0FF000000FF00FFFF
000000FFFF00FF00FFFFFFFFFF21F904
01000008002C


должно быть 48 байт до 2С, но их 56 получается...

   
 
 автор: Trianon   (27.05.2007 в 23:54)   письмо автору
 
   для: sim5   (27.05.2007 в 17:08)
 

Нету в GIF никаких признаков. Есть записи , точнее блоки переменной длины различных форматов. И компонуются они в GIF-поток достаточно причудливо.
Например, после Global screen descriptor перед Image descriptor (который действительно начинается с маркера 2С, может следовать Local screen descriptor, а может и не следовать. Может вообще следовать блок коментария или блок расширения приложения.

Ссылка на стандарт есть в той же ветке, где и мой парсер.

   
 
 автор: sim5   (28.05.2007 в 04:27)   письмо автору
 
   для: Trianon   (27.05.2007 в 23:54)
 

Вот кусочек вашего парсера:


case 0x2C:  $g['frames']++;; 
                  $blks = array();
                  . . . .  


Вот часть документа на который вы ссылаетесь:


i) Image Separator - Identifies the beginning of an Image Descriptor. This field contains the fixed value 0x2C.


Картинку прикрепляю, дамп ее заголовка приводится ранее. Получается маленькая несостыковка в байтах.

   
 
 автор: Trianon   (28.05.2007 в 09:46)   письмо автору
 
   для: sim5   (28.05.2007 в 04:27)
 

Дамп всего файла:

client version from file greenarrow.gif 
success, 229 bytes loaded 

Signature: GIF89a
Logical screen width:  32 
Logical screen height: 32 
Packed fields(10110011): 
--- Global color table present flag: 1 
--- Color resolution: 3 
--- Color table sort flag: 0 
--- Global color table size: 3 
Background color index: 8 
Pixel aspect ratio: 0 
color[0] = (0,0, 0);
color[1] = (128,0, 0);
color[2] = (0,128, 0);
color[3] = (128,128, 0);
color[4] = (0,0, 128);
color[5] = (128,0, 128);
color[6] = (0,128, 128);
color[7] = (128,128, 128);
color[8] = (192,192, 192);
color[9] = (255,0, 0);
color[10] = (0,255, 0);
color[11] = (255,255, 0);
color[12] = (0,0, 255);
color[13] = (255,0, 255);
color[14] = (0,255, 255);
color[15] = (255,255, 255);
Block-prefix[21] - extention introducer
Extention type: F9  - graphic control extention [4]
Packed fields(00000001): 
--- 3 reserved bits: 000
--- Disposal method: 0
--- User input falg: 0
--- Transparent color falg: 1
Delay time*100: 0 
Transparent color index: 8
[0]=''
Block-prefix[2C] - image descriptor
Image Left position: 0 
Image Top  position: 0 
Image Width:  32 
Image Height: 32 
Packed fields(01000000): 
--- Local color table present flag: 0 
--- Interlace flag: 1 
--- Color table sort flag: 0 
--- 2 reserved bits: 00 
--- Local color table size: 0 
Minimal LZW-code: 4
Data block 146 bytes length
Data block 0 bytes length
Block-prefix[3B] 

Вот детальная расшифровка "злополучного куска" :)

21 F9 04 01 00 00 08 00 - это блок расширения управления графикой
21    -  extention introducer block-prefix
F9    - graphic control extention 
04    - extention record length
01    - packed fileds (Transparent color falg)
00 00 - delay time
08    - Transparent color index: 8
00    - zero extention record length - extention records terminator

Фактически, это блок, указывающий, что в рисунке используется прозрачный цвет, и индекс этого цвета - 8

   
 
 автор: sim5   (28.05.2007 в 10:27)   письмо автору
 
   для: Trianon   (28.05.2007 в 09:46)
 

Да есть этот "злополучный кусок", просто в описании он не указан между глобальной палитрой и дескриптором изображения. Вывод - не верь глазам своим.

   
 
 автор: Trianon   (28.05.2007 в 11:44)   письмо автору
 
   для: sim5   (28.05.2007 в 10:27)
 

Ай-ай... А откуда я это взял?
Структура
Файлы формата GIF имеют блочную структуру. Это значит, что они состоят из отдельных блоков, которые в большинстве случаев никак не связаны друг с другом. Программы, не распознающие некоторые типы блоков, могут просто пропускать их - для этого у каждого нестандартного блока в заголовке указан его размер. Идущие один за другим блоки графики (картинки) составляют анимацию. Они сменяются на экране и создают иллюзию движения. До или после них (или даже между ними) в файле могут находиться другие блоки:

1 Комментарии. Скрытый текст, его можно увидеть лишь с помощью специальных программ - например, GIF-аниматоров, таких, как Ulead GIF Animator.
2 Простой текст. Строки символов с ограниченными возможностями форматирования. В настоящее время не используется.
3 Блоки управления графикой, задающие параметры вывода отдельных картинок.
4 Глобальная и локальные цветовые палитры, определяющие, какие именно цвета будут у картинок.
5 Особые блоки, которые могут использоваться лишь теми программами, которые знают об их существовании и назначении - например, блок Netscape, задающий число циклов анимации. Без него анимация после загрузки страницы срабатывает всего один раз. А в блоке Pianygif хранятся названия отдельных картинок для облегчения их редактирования.


Иногда полезно верить.

   
 
 автор: sim5   (28.05.2007 в 11:55)   письмо автору
 
   для: Trianon   (28.05.2007 в 11:44)
 

Ай-ай... Но воспринял это как информацию, а уперся в ниже идущую схему... На этот раз без вывода - хватит.)

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования