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
相关产品推荐
相关产品推荐

