Я запускаю php на интранет-сервере без www-соединения и без каких-либо графических библиотек.
Теперь мне нужно создать цветовой блок 16×16 пикселей (цветной # 86D0FF), и мне было интересно, есть ли способ вернуть требуемую последовательность байтов для такой простой вещи без необходимости устанавливать библиотеки?
Другими словами: я бы хотел добиться следующего без установки GD:
<?php
header("Content-Disposition: Attachment;filename=image.png"); // so that it can be saved...
header("Content-type: image/png");
$img = imagecreate(16,16);
$color = imagecolorallocate( $image , 134 , 208 , 255 );
imagefilledrectangle( $image , 0 , 0 , 16 , 16 , $color );
imagepng( $image );
imagedestroy( $image );
Хорошо, я нашел решение. Создавая сэмплы и сохраняя их в формате JPG, ICO, PNG и GIF и просматривая их с помощью шестнадцатеричного редактора, решил, что GIF выглядит наиболее простым. Итак, я сейчас читаю существующий GIF (как шаблон) и просто манипулирую байтами [37..39], которые (в этом конкретном файле) содержат значение цвета.
Значения цвета, которые я беру из CSS-файла, в котором они определены, поэтому также есть немного синтаксического анализа. Может быть, код может помочь вам вдохновить 😉
<?php
$css = file_get_contents('my.css');
$col = $_GET["col"]; // file is referenced using /coloursample.php?col=#
$patt = '/\.colGroup' . $col . '.*?background-color:.*?\#([A-F0-9]{3,6};/six';
$bin = file_get_contents('sample.gif');
if (preg_match($patt,$css,$regs))
{
$bin[37] = chr(hexdec(substr($regs[1],0,2)));
$bin[38] = chr(hexdec(substr($regs[1],2,2)));
$bin[39] = chr(hexdec(substr($regs[1],4,2)));
}header("Content-Disposition: Attachment; filename=color" . $regs[1] . "gif");
header("Cpntent-type: image/gif");
echo $bin;
Других решений пока нет …