You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP使用imagestring将Code128条码转为PNG时条码不显示问题

问题根因

你当前使用的bar128函数设计用途是生成浏览器可渲染的HTML条码,返回值是完整的HTML标签字符串。而imagestring是GD库用于绘制纯文本的函数,不具备HTML解析能力,只会将传入的HTML源码当做普通字符串逐字绘制到图片上,这就是你最终PNG里只有HTML代码的原因。

修复方案

不需要依赖原函数生成的HTML,直接复用它的Code128编码逻辑,拿到条码的宽度序列后直接用GD库绘制条码即可:

步骤1:修改条码生成文件,返回编码后的宽度序列

修改barcode128.php代码如下,新增返回宽度序列的逻辑:

<?php
global $char128asc,$char128charWidth;
$char128asc=' !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~'; 
$char128wid = array(
 '212222','222122','222221','121223','121322','131222','122213','122312','132212','221213', // 0-9 
 '221312','231212','112232','122132','122231','113222','123122','123221','223211','221132', // 10-19 
 '221231','213212','223112','312131','311222','321122','321221','312212','322112','322211', // 20-29 
 '212123','212321','232121','111323','131123','131321','112313','132113','132311','211313', // 30-39 
 '231113','231311','112133','112331','132131','113123','113321','133121','313121','211331', // 40-49 
 '231131','213113','213311','213131','311123','311321','331121','312113','312311','332111', // 50-59 
 '314111','221411','431111','111224','111422','121124','121421','141122','141221','112214', // 60-69 
 '112412','122114','122411','142112','142211','241211','221114','413111','241112','134111', // 70-79 
 '111242','121142','121241','114212','124112','124211','411212','421112','421211','212141', // 80-89 
 '214121','412121','111143','111341','131141','114113','114311','411113','411311','113141', // 90-99
 '114131','311141','411131','211412','211214','211232','23311120' ); // 100-106

// 新增函数:返回Code128编码后的宽度序列
function getBar128Widths($text) {
    global $char128asc,$char128wid; 
    $w = $char128wid[$sum = 104]; // START symbol
    $onChar=1;
    for($x=0;$x<strlen($text);$x++){
        if (!( ($pos = strpos($char128asc,$text[$x])) === false )){
            $w.= $char128wid[$pos];
            $sum += $onChar++ * $pos;
        }
    }
    $w.= $char128wid[ $sum % 103 ].$char128wid[106]; // 校验码 + 结束符
    return $w;
}
?>

步骤2:用GD库直接绘制条码PNG

替换你原来的PNG生成代码,直接用宽度序列绘制条码:

<?php
$code = 'ab1234cd';
include 'barcode128.php';
$barWidths = getBar128Widths($code);

// 条码配置参数
$barHeight = 50; // 条码高度
$zoom = 2; // 放大系数,避免条码过细无法识别
$textHeight = 15; // 底部预留文字高度
$totalWidth = array_sum(str_split($barWidths)) * $zoom;
$totalHeight = $barHeight + $textHeight;

// 创建画布
$im = imagecreate($totalWidth, $totalHeight);
$white = imagecolorallocate($im, 255, 255, 255);
$black = imagecolorallocate($im, 0, 0, 0);

// 绘制条码
$x = 0;
$isBlack = true;
foreach(str_split($barWidths) as $w){
    $w = $w * $zoom;
    if($isBlack){
        imagefilledrectangle($im, $x, 0, $x + $w -1, $barHeight, $black);
    }
    $x += $w;
    $isBlack = !$isBlack;
}

// 绘制底部文字
$fontSize = 3;
$textX = ($totalWidth - imagefontwidth($fontSize)*strlen($code)) / 2;
imagestring($im, $fontSize, $textX, $barHeight + 2, $code, $black);

// 保存图片
imagepng($im, 'f.png');
imagedestroy($im);
?>

内容的提问来源于stack exchange,提问作者Saeed Eisakhani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 22:27:05