Мне нужно сгенерировать прозрачный GIF нестандартного размера без использования imagecreate () или imagecreatetruecolor () по соображениям памяти / производительности.
Мне нужно, чтобы изображение было как можно меньше, поэтому я хотел бы использовать не GCT, а только GCE, задающий прозрачность, например, для изображения размером 200x200px, например:
47 49 46 38 39 61 - GIF89a
C8 00 - 200px
C8 00 - 200px
00 - No GCT
00 00
21 F9 - Graphic Control Extension
04 01 0A 00 01 - colour #1 is transparent (I've seen this work on a 1x1 transparent GIF also without GCT)
00 - section separator
2C - image block
00 00 00 00 - block start position x=0, y=0
C8 00 C8 00 - block width and height, actually the image size
00 - section separator
? - image data follows
00 - section separator
3B - image end
До сих пор я мог генерировать вышеупомянутую структуру GIF, но часть, в которой я застрял, — это то, где мне нужно создать закодированные данные LZW.
Для прозрачного пиксельного изображения 1×1, которое работает, я видел следующие байты:
02 - LZW minimum code size
02 - LZW data length
4C 01 - actual LZW data
Во-первых, у меня есть сомнения в понимании того, как это расшифровывается. Означает ли это, что таблица отображения LZW имеет 3-битные коды? Если да, то как он отображается в байтах?
Может ли кто-нибудь объяснить или предоставить фрагмент кода, который будет генерировать данные LZW для прозрачного GIF произвольной ширины x высоты?
Наконец, я сохранил блок как прозрачный блок 1×1, который действителен и работает во всех браузерах.
При таком подходе вам также необходимо сохранить размеры блока до 1 x 1, например:
2C - image block
00 00 00 00 - block start position x=0, y=0
01 00 01 00 - block width and height, actually the image size
Других решений пока нет …