Конвертируйте PNG в черно-белый GIF с помощью gd или imagemagick

Я генерирую штрих-коды на веб-странице PHP с Библиотека Picqer, который может выводить в PNG, JPG, SVG или HTML.

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

Если я сохраню сгенерированное изображение PNG в файл и с помощью Photoshop преобразую его в GIF (без прозрачности, 0 сглаживания, 2 цвета), а затем снова открою изображение в браузере и напечатаю, я получу идеальное, четкое изображение без размывания.

Поэтому я попытался преобразовать напрямую в GIF с библиотекой gd в PHP:

// Create a GD image from the PNG generated by getBarcode. ($result = the Picqer\Barcode\BarcodeGeneratorPNG::getBarcodeoutput
$gd_image = imagecreatefromstring($result);

// Convert to palette image with no dithering and 2 colors
imagetruecolortopalette($gd_image, false, 2);

// Output the image as a GIF:
header('Content-Type: image/gif');
imagegif($gd_image, false); // Output directly to browser

Тем не менее, это создает точную копию PNG — при печати он размыт.

Как я могу это исправить, чтобы создать 2-цветный GIF без сглаживания и прозрачности? Я думаю, что это решило бы проблему ясности вывода. Если есть лучший способ, я открыт для этого.

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

Спасибо!

ОБНОВЛЕНИЕ № 1:
ОК, так что я сделал немного прогресс: я переключился на Image Magick и выполнил следующее преобразование из исходного файла PNG в 2-цветный безцветный GIF-файл, который отображает красиво чистое и четкое черно-белое изображение:

$im = new Imagick();
$im->readImageBlob($result);    // convert string to Imagic

// Quantize:
$im->quantizeImage(2, imagick::COLORSPACE_GRAY, 1, false, false);

// Output image as GIF
$im->setIMageFormat('gif');
header("Content-Type: image/gif");
echo $im->getImageBlob();

ПРОБЛЕМА: этот метод кажется очень ресурсоемким. Когда я запрашиваю страницу, заполненную изображениями со штрих-кодом (20-30 кол-во), некоторые изображения отображаются как «поврежденные», что приводит к ошибкам http 500 «конец вывода сценария перед заголовками».

Я предполагаю, что это означает, что процедуры Imagick используют большие ресурсы памяти / процессора, поэтому, когда браузер запрашивает много изображений одновременно, PHP достигает пределов своих ресурсов.

ОБНОВЛЕНИЕ № 2:
Тесты производительности показывают, что Imagick является узким местом:
Генерация 133 штрих-кодов на одной HTML-странице в формате PNG:
Среднее время выполнения функции getBarcode (): 733 мкс
Среднее время для получения результата: 13 мкс

Генерация тех же 133 штрих-кодов с использованием преобразования Imagick, указанного выше:
getBarcode () — в среднем 1 мс
Преобразование в GIF: средняя 0,76 S

Поэтому мне интересно, почему Imagick так медленно …? Это крошечный файлы, порядка 200 байтов (PNG).

ОБРАЗЕЦ ВХОДНОГО PNG ИЗОБРАЖЕНИЯ: Образец штрих-кода

3

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]