Как использовать PHP GD для создания 1-битных растровых изображений (только черно-белые, без серого)

Моя цель

У меня есть PNG. В настоящее время он имеет сглаживание или, другими словами, оттенки серого. Я хочу, чтобы изображение было 1 битом или, другими словами, использовалось только черно-белое изображение. Моя цель - сделать это с помощью PHP GD. Я должен сделать это с существующим изображением и не могу создать изображение с нуля, используя imagecreatetruecolor.

Что я пытаюсь

Я обнаружил, что лучше всего подходит для этой работы функция imagetruecolortopalette http://php.net/manual/en/function.imagetruecolortopalette.php

Вот простая версия того, что я пытаюсь сделать

$user_design = base64_decode($_POST['input']);
$design_file = fopen('path/filename.png', 'w') or die("Unable to open file!");
imagetruecolortopalette($design_file, false, 1);
fwrite($design_file, $user_design);
fclose($design_file);

И это ключевая линия. 1 - это «максимальное количество цветов, которое должно оставаться в палитре».

imagetruecolortopalette($design_file, false, 1);

Я наблюдаю за поведением

Изображение остается неизменным. Я не уверен, правильно ли я использую PHP GD, или эта функция не делает то, что я думаю.

Другие идеи

Это тоже кажется многообещающим.

imagecolordeallocate кажется, что я могу использовать его для освобождения цветов, но не знаю, как это сделать, не вызывая его 254 раза.

http://php.net/manual/en/function.imagecolordeallocate.php

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

http://php.net/manual/en/function.imagecolorset.php

В большинстве случаев я подозреваю, что лучше всего подойдет imageetruecolortopallette, но любые идеи приветствуются.


person Goose    schedule 10.07.2015    source источник
comment
возможный дубликат Создайте 1 растровое изображение (монохромное) в php   -  person MaxVT    schedule 10.07.2015
comment
Нет, потому что именно так можно создать однобитовое растровое изображение с нуля, и мне нужно сделать это с существующим изображением. Я изменю свой вопрос, чтобы прояснить это.   -  person Goose    schedule 10.07.2015
comment
Для 1-битного изображения макс. количество цветов должно быть 2. Одноцветное изображение представляет собой плоский цветной блок.   -  person MaxVT    schedule 10.07.2015
comment
У меня не было плоского цветного блока, у меня было исходное изображение, так что либо я неправильно использую GD, либо это неправильная функция. Я не уверен, что именно. Я думаю, что я не могу использовать такой ресурс, как файл, с GD, а GD принимает только строки и может создавать изображения только с нуля. Любые знания по этому поводу будут оценены.   -  person Goose    schedule 10.07.2015


Ответы (1)


$im = imagecreatefromstring($user_design);
imagefilter($im, IMG_FILTER_GRAYSCALE);
imagefilter($im, IMG_FILTER_CONTRAST, -1000);
imagepng($im, 'path/filename.png');
imagedestroy($im);

Как преобразовать изображение в черный и белый в PHP

person Bartłomiej T. Listwon    schedule 11.07.2015
comment
Это работает, однако, согласно комментариям в вопросе, который вы связали, мне пришлось изменить его на imagefilter($im, IMG_FILTER_CONTRAST, -1000); с -1000 вместо -100 - person Goose; 13.07.2015
comment
Кроме того, он делает фон (или, возможно, текст на элементах пути) черным, даже когда я закомментировал IMG_FILTER_GRAYSCALE и IMG_FILTER_CONTRAST. Это, однако, отдельная проблема, и ваш ответ выполнил то, о чем я просил. - person Goose; 13.07.2015