【问题标题】:Converting RGB image to Floyd-Steinberg image using PHP or Javascript for Zebra printers使用 PHP 或 Javascript 为 Zebra 打印机将 RGB 图像转换为 Floyd-Steinberg 图像
【发布时间】:2019-05-04 11:46:24
【问题描述】:

我正在开发一个基于桌面的PHP 应用程序,我们需要捕获一个人的图像并使用 Zebra GC420t 打印机将其打印在标签上 预期的图像应如下图所示。

当我尝试打印时,它会给出如下图所示的输出。

我正在使用以下代码将rgb图像转换为dithering图像使用php代码

 $photo_url="";
if(isset($_GET['photo'])){
  $photo_url=$_GET['photo'];
}

function image2grf($filename='$photo_url', $targetname = 'R:IMAGE.GRF')
{
  $info = getimagesize($filename);
  $im = imagecreatefrompng($filename);
  $width = $info[0]; // imagesx($im);
  $height = $info[1]; // imagesy($im);
  $depth = $info['bits'] ?: 1;
  $threshold = $depth > 1 ? 160 : 0;
  $hexString = '';
  $byteShift = 7;
  $currentByte = 0;
  // iterate over all image pixels
  for ($y = 0; $y < $height; $y++) {
    for ($x = 0; $x < $width; $x++) {
      $color = imagecolorat($im, $x, $y);
      // compute gray value from RGB color
      if ($depth > 1) {
        $value = max($color >> 16, $color >> 8 & 255, $color & 255);
      } else {
        $value = $color;
      }
      // set (inverse) bit for the current pixel
      $currentByte |= (($value > $threshold ? 0 : 1) << $byteShift);
      $byteShift--;
      // 8 pixels filled one byte => append to output as hex
      if ($byteShift < 0) {
        $hexString .= sprintf('%02X', $currentByte);
        $currentByte = 0;
        $byteShift = 7;
      }
    }
    // append last byte at end of row
    if ($byteShift < 7) {
      $hexString .= sprintf('%02X', $currentByte);
      $currentByte = 0;
      $byteShift = 7;
    }
    $hexString .= PHP_EOL;
  }
  // compose ZPL ~DG command
  $totalBytes = ceil(($width * $height) / 8);
  $bytesPerRow = ceil($width / 8);
return sprintf('~DG%s,%05d,%03d,' . PHP_EOL, $targetname, $totalBytes, $bytesPerRow) . $hexString;
}
// Usage:
print "^XA N ^XZ" . PHP_EOL;
print image2grf($photo_url, 'R:SAMPLE.GRF');
//print "^XA^FO20,20^XGR:SAMPLE.GRF,1,1^FS^XZ" . PHP_EOL;

我正在使用下面的javascript 代码连接我的应用程序并将参数传递给打印机

    var available_printers = null;
var selected_category = null;
var default_printer = null;
var selected_printer = null;
var format_start = "^XA^LL200^FO80,50^A0N36,36^FD";
var format_end = "^FS^XZ";
var default_mode = true;

function setup_web_print()
{
    $('#printer_select').on('change', onPrinterSelected);
    showLoading("Loading Printer Information...");
    default_mode = true;
    selected_printer = null;
    available_printers = null;
    selected_category = null;
    default_printer = null;

    BrowserPrint.getDefaultDevice('printer', function(printer)
    {
        default_printer = printer
        if((printer != null) && (printer.connection != undefined))
        {
            selected_printer = printer;
            var printer_details = $('#printer_details');
            var selected_printer_div = $('#selected_printer');

            selected_printer_div.text("Using Default Printer: " + printer.name);
            hideLoading();
            printer_details.show();
            $('#print_form').show();

        }
        BrowserPrint.getLocalDevices(function(printers)
            {
                available_printers = printers;
                var sel = document.getElementById("printers");
                var printers_available = false;
                sel.innerHTML = "";
                if (printers != undefined)
                {
                    for(var i = 0; i < printers.length; i++)
                    {
                        if (printers[i].connection == 'usb')
                        {
                            var opt = document.createElement("option");
                            opt.innerHTML = printers[i].connection + ": " + printers[i].uid;
                            opt.value = printers[i].uid;
                            sel.appendChild(opt);
                            printers_available = true;
                        }
                    }
                }

                if(!printers_available)
                {
                    showErrorMessage("No Zebra Printers could be found!");
                    hideLoading();
                    $('#print_form').hide();
                    return;
                }
                else if(selected_printer == null)
                {
                    default_mode = false;
                    changePrinter();
                    $('#print_form').show();
                    hideLoading();
                }
            }, undefined, 'printer');
    }, 
    function(error_response)
    {
        showBrowserPrintNotFound();
    });
};
function showBrowserPrintNotFound()
{
    showErrorMessage("An error occured while attempting to connect to your Zebra Printer. You may not have Zebra Browser Print installed, or it may not be running. Install Zebra Browser Print, or start the Zebra Browser Print Service, and try again.");

};
  // new Date().toLocaleTimeString('en-US', { hour12: false, 
  //                                            hour: "numeric", 
  //                                            minute: "numeric"});

function sendData(photoURL)
{

    var test;
        $.ajax({
            url: 'db/zpl.php?photo='+photoURL,
            cache: false,
            contentType: false,
            processData: false,
            type: 'GET',
            success: function(data) {
            test=data;
            console.log("From ZPL:"+data);

            }

        });



    var mob="",lap="",other="";
    if($("#emobile").val()==="on"){
        mob="Mobile";
    }

    if($("#elaptop").val()==="on"){
        lap="Laptop";
    }

    if($("#eother").val()==="on"){
        other="Other";
    }

    showLoading("Printing...");
    checkPrinterStatus( function (text){
        if (text == "Ready to Print")
        {
        selected_printer.send("^XA N ^XZ");
        selected_printer.send("~DYE:SAMPLE.GRF,A,GRF,5000,030"+test+",A");          selected_printer.send("^XA^FX^CFA,30^FO10,70^FDVisitorName:"+$("#user").val()+"^FS^FO10,120^FDCompany:"+$("#compName").val()+"^FS ^FO10,170^FDTo Meet:"+$("#toMeet").val()+"^FS ^FO10,220^FDPurpose:"+$("#reason").val()+"^FS ^FO10,270^FDAuthorise^FS ^FO10,320^FDto Carry:"+mob+" "+lap+"^FS^FO250,70^XG R:SAMPLE.GRF,1,1^FS^XZ");
        }
        else
        {
            printerError(text);
        }
    });
};

function checkPrinterStatus(finishedFunction)
{
    selected_printer.sendThenRead("~HQES", 
                function(text){
                        var that = this;
                        var statuses = new Array();
                        var ok = false;
                        var is_error = text.charAt(70);
                        var media = text.charAt(88);
                        var head = text.charAt(87);
                        var pause = text.charAt(84);
                        // check each flag that prevents printing
                        if (is_error == '0')
                        {
                            ok = true;
                            statuses.push("Ready to Print");
                        }
                        if (media == '1')
                            statuses.push("Paper out");
                        if (media == '2')
                            statuses.push("Ribbon Out");
                        if (media == '4')
                            statuses.push("Media Door Open");
                        if (media == '8')
                            statuses.push("Cutter Fault");
                        if (head == '1')
                            statuses.push("Printhead Overheating");
                        if (head == '2')
                            statuses.push("Motor Overheating");
                        if (head == '4')
                            statuses.push("Printhead Fault");
                        if (head == '8')
                            statuses.push("Incorrect Printhead");
                        if (pause == '1')
                            statuses.push("Printer Paused");
                        if ((!ok) && (statuses.Count == 0))
                            statuses.push("Error: Unknown Error");
                        finishedFunction(statuses.join());
            }, printerError);
};
function hidePrintForm()
{
    $('#print_form').hide();
};
function showPrintForm()
{
    $('#print_form').show();
};
function showLoading(text)
{
    $('#loading_message').text(text);
    $('#printer_data_loading').show();
    hidePrintForm();
    $('#printer_details').hide();
    $('#printer_select').hide();
};
function printComplete()
{
    hideLoading();
    alert ("Printing complete");
}
function hideLoading()
{
    $('#printer_data_loading').hide();
    if(default_mode == true)
    {
        showPrintForm();
        $('#printer_details').show();
    }
    else
    {
        $('#printer_select').show();
        showPrintForm();
    }
};
function changePrinter()
{
    default_mode = false;
    selected_printer = null;
    $('#printer_details').hide();
    if(available_printers == null)
    {
        showLoading("Finding Printers...");
        $('#print_form').hide();
        setTimeout(changePrinter, 200);
        return;
    }
    $('#printer_select').show();
    onPrinterSelected();
}

function onPrinterSelected()
{
    selected_printer = available_printers[$('#printers')[0].selectedIndex];
}

function showErrorMessage(text)
{
    $('#main').hide();
    $('#error_div').show();
    $('#error_message').html(text);
}

function printerError(text)
{
    showErrorMessage("An error occurred while printing. Please try again." + text);
}

function trySetupAgain()
{
    $('#main').show();
    $('#error_div').hide();
    setup_web_print();
    //hideLoading();
}

在下面的函数中,我发送打印所需的参数

        selected_printer.send("^XA^FX^CFA,30^FO10,70^FDVisitorName:"+$("#user").val()+"^FS^FO10,120^FDCompany:"+$("#compName").val()+"^FS ^FO10,170^FDTo Meet:"+$("#toMeet").val()+"^FS ^FO10,220^FDPurpose:"+$("#reason").val()+"^FS ^FO10,270^FDAuthorise^FS ^FO10,320^FDto Carry:"+mob+" "+lap+"^FS^FO250,70^XG R:SAMPLE.GRF,1,1^FS^XZ");

在上述函数中,图像数据存储在^FO250,70^XG R:SAMPLE.GRF,1,1^FS

当我将数据发送到打印机时,它会正确打印所有文本,但会打印第二张图片所示的图像,但要打印的预期图像如第一张图片所示。如果我对在labelary 网站中完成的图像转换进行硬编码,我可以打印第一张图像。如果我实时单击图像并打印它会给出第二张图像。

【问题讨论】:

标签: javascript php image-processing zebra-printers dithering


【解决方案1】:

看看这个库GDIndexedColorConverter,这是一个将图像转换为索引颜色模式的简单库。

require 'GDIndexedColorConverter.php';

// create an image
$image = imagecreatefromjpeg('image.jpg');

// create a gd indexed color converter
$converter = new GDIndexedColorConverter();

// the color palette
$palette = array(
    array(0, 0, 0),
    array(255, 255, 255),
    array(0, 0, 0),
    array(0, 0, 0),
    array(0, 0, 0)
);

// convert the image to indexed color mode
$new_image = $converter->convertToIndexedColor($image, $palette, 0.25);

// save the new image
imagepng($new_image, 'example_indexed_color.png', 0);

这是输入:

这是输出:

【讨论】:

  • 代码有效,但我想存储图像 GRF 格式。如您所见,第二个 php 代码将转换后的代码存储在 R:SAMPLE.GRF 中,我将使用 javascript 将其传递给打印机
  • 看看这个要点gist.github.com/thomascube/9651d6fa916124a9c52cb0d4262f2c3f,我自己测试过之前的代码,但我不确定,但还是试试吧..这不是一种常见的格式。
  • 仅在尝试该代码后,我得到了第二张图像作为输出
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-17
  • 1970-01-01
  • 2017-08-02
  • 2014-02-16
  • 2018-08-15
  • 1970-01-01
  • 2011-03-04
相关资源
最近更新 更多