Похоже, ошибка. Я подтверждаю то же самое поведение. Он заполняет только верхние 2 пикселя, если указать ширину равной 1. Аналогично для 2 или 3. 4 кажется волшебным значением - оно начинает работать там.
С другой стороны, эта ошибка, по-видимому, не появляется, если вы используете изображение высотой 1px, т. Е. Я пробовал это, и оно работало как ожидалось:
$canvas = imagecreatetruecolor(100, 1);
$red = imagecolorallocate($canvas, 0xEE, 0, 0);
imagefill($canvas, 0, 0, $red);
imagegif($canvas, "output.png");
Так что это может быть своего рода обходной путь.