Я генерирую штрих-коды на веб-странице 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 ИЗОБРАЖЕНИЯ:
Задача ещё не решена.
Других решений пока нет …