Создайте однобитовое растровое изображение (монохромное) в php

Я ищу возможность записать 1 бит битовой карты из строки с этим контентом:

$str = "001011000111110000"; 

Нуль белый, а один черный. Файл BMP будет 18 x 1 px.

Я не хочу 24-битного BMP, но реальный 1-битный BMP.

Кто-нибудь знает заголовок и метод преобразования в PHP?

Это немного странная просьба 🙂

Итак, вы бы хотели использовать php-gd для начала. Как правило, это включено при установке php на любую ОС с достойным репо, но просто не забудьте, что это не для вас, вы можете получить инструкции по установке здесь;

http://www.php.net/manual/en/image.setup.php

Во-первых, нам нужно выяснить, насколько велика будет изображение в ширину; высота, очевидно, всегда будет одной.

Так;

 $str = $_GET['str']; $img_width = strlen($str); 

strlen сообщит нам, сколько символов в строке $ str, и поскольку мы даем один пиксель на символ, количество символов даст нам необходимую ширину.

Для облегчения доступа разделите строку на массив – с каждым элементом для каждого отдельного пикселя.

 $color_array = str_split($str); 

Теперь давайте настроим «указатель», для которого мы рисуем пиксель. Это php, поэтому вам НЕ НУЖНО делать это, но приятно быть аккуратным.

 $current_px = (int) 0; 

И теперь вы можете инициализировать GD и начать делать изображение;

 $im = imagecreatetruecolor($img_width, 1); // Initialise colours; $black = imagecolorallocate($im, 0, 0, 0); $white = imagecolorallocate($im, 255, 255, 255); // Now, start running through the array foreach ($color_array as $y) { if ($y == 1) { imagesetpixel ( $im, $current_px , 1 , $black ); } $current_px++; // Don't need to "draw" a white pixel for 0. Just draw nothing and add to the counter. } 

Это нарисует ваше изображение, тогда все, что вам нужно, это отобразить его;

 header('Content-type: image/png'); imagepng($im); imagedestroy($im); 

Обратите внимание, что декларация $ white вовсе не нужна – я просто оставил ее, чтобы дать вам представление о том, как вы объявляете разные цвета с помощью gd.

Вам, вероятно, придется немного отладить это, прежде чем использовать его – это было давно, так как я использовал GD. В любом случае, надеюсь, что это поможет!

Это НЕ странный запрос.

Я полностью согласен с целью вопроса, на самом деле мне приходится управлять некоторыми 1-битными монохромными изображениями.

Ответ:

  • GD не хорошо документирован на веб-сайте PHP.
  • Когда вы хотите создать изображение с нуля, вы должны использовать imagecreate() или imagecreatetruecolor()
  • Кажется, что оба упомянутых метода (функций) не могут создавать 1-битные изображения с нуля.
  • Я решил создать внешнее изображение, 1 бит монохромного png, загрузив его imagecreatefrompng() .

Кроме того: я только что загрузил официальную библиотеку с открытым исходным кодом. Официальный репозиторий Bitbucket

Что я нашел в gd.h ?:

Определение верхних названных функций:

 /* Functions to manipulate images. */ /* Creates a palette-based image (up to 256 colors). */ BGD_DECLARE(gdImagePtr) gdImageCreate (int sx, int sy); /* An alternate name for the above (2.0). */ \#define gdImageCreatePalette gdImageCreate /* Creates a truecolor image (millions of colors). */ BGD_DECLARE(gdImagePtr) gdImageCreateTrueColor (int sx, int sy); 

Таким образом, «официальное» решение: создать изображение с цветной палитрой с помощью imagecreate() (которое обертывает gdImageCreate() GD).

«Альтернативным» решением является создание внешнего изображения, 1 бит монохромного png, и с помощью imagecreatefrompng() как я сказал выше.