|
|
|
| Хочу выдрать глобальную палитру из 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],
|
Запятая оказывается не там, где надо. Что я не так делаю? | |
|
|
|
|
|
|
|
для: Unkind
(27.05.2007 в 13:00)
| | Поле SIZE дескриптора лог. экрана содержит размер глобальной плитры, и согласно приведенной таблицы, получается что складывается из ее размера плюс числа цветов. Проверял на картинках - при size = 3, до запятой получается 48 байт палитры, плюс 16 бат цветов. Вот так видимо надо считать. | |
|
|
|
|
|
|
|
для: sim5
(27.05.2007 в 14:10)
| | Поле SIZE содержит не сам размер, а его сдвиг.
число цветов равно 1<<(SIZE+1),
А число байт таблицы цветов = 3 <<(SIZE+1).
Eсли SIZE = 3, это значит, что число цветов = 1<<4 = 16,
Что соответствует 48 байтам таблицы. | |
|
|
|
|
|
|
|
для: Trianon
(27.05.2007 в 14:40)
| | если, принять во внимание только это - 48 байт, то до запятой никак не получается.
Но при 5, никак не получается и 256 до запятой. | |
|
|
|
|
|
|
|
для: 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($fh, 10, SEEK_SET);
$size = bindec(substr(decbin(ord(fread($fh, 1))), 6));
fseek($fh, 13, SEEK_SET);
for($i = 0; $i < (1 << ($size + 1)) * 3; $i += 3)
{
$rgb = fread($fh, 3);
echo(ord($rgb[0]) . "." . ord($rgb[1]) . "." . ord($rgb[2]) . "\r\n");
}
//Следующий знак должен быть ",":
echo(fread($fh, 1999)); //Но нет, это не запятая, а chr(0)
fclose($fh);
?>
|
Запятая вообще еще довольно далеко. Что-то не то... | |
|
|
|
|
|
|
|
для: Unkind
(27.05.2007 в 16:07)
| | Ребята, какая запятая, вы о чем вообще?
GIF-формат основан на бинарном потоке, не на текстовом.
Я сюда как-то свой парсер клал, можно попробовать найти.
Он парсил всё вплоть до уровня LZW-данных.
UPD. http://softtime.ru/forum/read.php?id_forum=1&id_theme=13137 | |
|
|
|
|
|
|
|
для: Trianon
(27.05.2007 в 17:00)
| | Признак начала картинки в GIF - 2C.
Если смотреть HEX-редактором картинку, то исходя из условия что SIZE это 3*число цветов,
то до первого 2С в HEX-коде никак не получается.
P.S. Вот например:
47494638396120002000B30800000000
80000000800080800000008080008000
8080808080C0C0C0FF000000FF00FFFF
000000FFFF00FF00FFFFFFFFFF21F904
01000008002C
|
должно быть 48 байт до 2С, но их 56 получается... | |
|
|
|
|
|
|
|
для: sim5
(27.05.2007 в 17:08)
| | Нету в GIF никаких признаков. Есть записи , точнее блоки переменной длины различных форматов. И компонуются они в GIF-поток достаточно причудливо.
Например, после Global screen descriptor перед Image descriptor (который действительно начинается с маркера 2С, может следовать Local screen descriptor, а может и не следовать. Может вообще следовать блок коментария или блок расширения приложения.
Ссылка на стандарт есть в той же ветке, где и мой парсер. | |
|
|
|
|
|
|
|
для: 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.
|
Картинку прикрепляю, дамп ее заголовка приводится ранее. Получается маленькая несостыковка в байтах. | |
|
|
|
|
|
|
|
для: 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 | |
|
|
|
|
|
|
|
для: Trianon
(28.05.2007 в 09:46)
| | Да есть этот "злополучный кусок", просто в описании он не указан между глобальной палитрой и дескриптором изображения. Вывод - не верь глазам своим. | |
|
|
|
|
|
|
|
для: sim5
(28.05.2007 в 10:27)
| | Ай-ай... А откуда я это взял?
Структура
Файлы формата GIF имеют блочную структуру. Это значит, что они состоят из отдельных блоков, которые в большинстве случаев никак не связаны друг с другом. Программы, не распознающие некоторые типы блоков, могут просто пропускать их - для этого у каждого нестандартного блока в заголовке указан его размер. Идущие один за другим блоки графики (картинки) составляют анимацию. Они сменяются на экране и создают иллюзию движения. До или после них (или даже между ними) в файле могут находиться другие блоки:
1 Комментарии. Скрытый текст, его можно увидеть лишь с помощью специальных программ - например, GIF-аниматоров, таких, как Ulead GIF Animator.
2 Простой текст. Строки символов с ограниченными возможностями форматирования. В настоящее время не используется.
3 Блоки управления графикой, задающие параметры вывода отдельных картинок.
4 Глобальная и локальные цветовые палитры, определяющие, какие именно цвета будут у картинок.
5 Особые блоки, которые могут использоваться лишь теми программами, которые знают об их существовании и назначении - например, блок Netscape, задающий число циклов анимации. Без него анимация после загрузки страницы срабатывает всего один раз. А в блоке Pianygif хранятся названия отдельных картинок для облегчения их редактирования.
Иногда полезно верить. | |
|
|
|
|
|
|
|
для: Trianon
(28.05.2007 в 11:44)
| | Ай-ай... Но воспринял это как информацию, а уперся в ниже идущую схему... На этот раз без вывода - хватит.) | |
|
|
|