添加条码生成功能。
需要调用新库zxingc.dll。
代码如下:

程序代码:
* [color=#808080]============================================[/color]
* ZXing 条码生成库 [color=#808080]- VFP 调用版本[/color]
* 适用于 zxingc.dll (ZXing[color=#808080]-C++ C API)[/color]
* [color=#808080]============================================[/color]
* [color=#808080]============================================[/color]
* [color=#800000]1. DLL 函数声明[/color]
* [color=#808080]============================================[/color]
* CreatorOptions 相关
DECLARE Integer ZXing_CreatorOptions_new IN zxingc.dll Integer nFormat
DECLARE ZXing_CreatorOptions_delete IN zxingc.dll Integer pOpts
DECLARE ZXing_CreatorOptions_setFormat IN zxingc.dll Integer pOpts, Integer nFormat
DECLARE ZXing_CreatorOptions_setOptions IN zxingc.dll Integer pOpts, String cOptions
* 生成条码
DECLARE Integer ZXing_CreateBarcodeFromText IN zxingc.dll ;
String cData, Integer nSize, Integer pOpts
* WriterOptions 相关
DECLARE Integer ZXing_WriterOptions_new IN zxingc.dll
DECLARE ZXing_WriterOptions_delete IN zxingc.dll Integer pOpts
DECLARE ZXing_WriterOptions_setScale IN zxingc.dll Integer pOpts, Integer nScale
DECLARE ZXing_WriterOptions_setAddQuietZones IN zxingc.dll Integer pOpts, Integer nAdd
DECLARE ZXing_WriterOptions_setRotate IN zxingc.dll Integer pOpts, Integer nRotate
* 渲染图片
DECLARE Integer ZXing_WriteBarcodeToImage IN zxingc.dll ;
Integer pBarcode, Integer pWriterOpts
* 获取图片信息
DECLARE Integer ZXing_Image_width IN zxingc.dll Integer pImage
DECLARE Integer ZXing_Image_height IN zxingc.dll Integer pImage
DECLARE Integer ZXing_Image_data IN zxingc.dll Integer pImage
DECLARE Integer ZXing_Image_format IN zxingc.dll Integer pImage
* 释放资源
DECLARE ZXing_Image_delete IN zxingc.dll Integer pImage
DECLARE ZXing_Barcode_delete IN zxingc.dll Integer pBarcode
DECLARE ZXing_free IN zxingc.dll Integer pPtr
* 辅助函数
DECLARE String ZXing_LastErrorMsg IN zxingc.dll
DECLARE String ZXing_Version IN zxingc.dll
* [color=#808080]============================================[/color]
* [color=#800000]2. 条码格式常量(基于 ZX_BCF_ID 计算)[/color]
* [color=#808080]============================================[/color]
* 零售类 (Retail)
#define ZX_FORMAT_EAN13 12625 && EAN-13
#define ZX_FORMAT_EAN8 14405 && EAN-8
#define ZX_FORMAT_UPCA 24929 && UPC-A
#define ZX_FORMAT_UPCE 25957 && UPC-E
#define ZX_FORMAT_DATABAR 8309 && GS1 DataBar
#define ZX_FORMAT_DATABAR_EXP 8309 && GS1 DataBar Expanded
* 工业类 (Industrial)
#define ZX_FORMAT_CODE39 8257 && Code 39
#define ZX_FORMAT_CODE93 8263 && Code 93
#define ZX_FORMAT_CODE128 8259 && Code 128
#define ZX_FORMAT_ITF 8265 && ITF
#define ZX_FORMAT_CODABAR 8294 && Codabar
* 二维码[color=#808080]/矩阵 (2D/Matrix)[/color]
#define ZX_FORMAT_QRCODE 8273 && QR Code
#define ZX_FORMAT_MICROQR 8561 && Micro QR Code
#define ZX_FORMAT_RMQR 8306 && rMQR Code
#define ZX_FORMAT_DATAMATRIX 8292 && Data Matrix
#define ZX_FORMAT_PDF417 8268 && PDF417
#define ZX_FORMAT_AZTEC 8314 && Aztec
#define ZX_FORMAT_MAXICODE 8277 && MaxiCode
*运行测试
CLEAR
TestAllFormats()
* [color=#808080]============================================[/color]
* [color=#800000]3. 保存灰度图为 BMP 文件(内部函数)[/color]
* [color=#808080]============================================[/color]
FUNCTION SaveGrayAsBMP(tcGrayData, tnWidth, tnHeight, tcFilePath)
LOCAL lnFileHandle, lcHeader, lnRow, lcBGRRow, i, j
LOCAL lnRowSize, lnBMPRowSize, lnFileSize
LOCAL lcRGBData
* 转换为24位RGB
lcRGBData = ""
FOR i = 1 TO tnWidth * tnHeight
lcRGBData = lcRGBData + REPLICATE(SUBSTR(tcGrayData, i, 1), 3)
ENDFOR
* BMP行对齐
lnRowSize = tnWidth * 3
lnBMPRowSize = lnRowSize
IF lnBMPRowSize % 4 != 0
lnBMPRowSize = lnBMPRowSize + (4 - (lnBMPRowSize % 4))
ENDIF
lnFileSize = 54 + lnBMPRowSize * tnHeight
* BMP文件头
lcHeader = "BM" + BINTOC(lnFileSize, "4RS") + BINTOC(0, "4RS") + BINTOC(54, "4RS")
lcHeader = lcHeader + BINTOC(40, "4RS") + BINTOC(tnWidth, "4RS") + BINTOC(tnHeight, "4RS")
lcHeader = lcHeader + BINTOC(1, "2RS") + BINTOC(24, "2RS") + BINTOC(0, "4RS")
lcHeader = lcHeader + BINTOC(0, "4RS") + BINTOC(0, "4RS") + BINTOC(0, "4RS") + BINTOC(0, "4RS") + BINTOC(0, "4RS")
* 写入文件
lnFileHandle = FCREATE(tcFilePath)
IF lnFileHandle <= 0
RETURN .F.
ENDIF
= FWRITE(lnFileHandle, lcHeader)
* 写入像素数据(从底到顶,RGB转BGR)
FOR lnRow = tnHeight - 1 TO 0 STEP -1
lcBGRRow = ""
FOR j = 1 TO tnWidth
lcBGRRow = lcBGRRow + SUBSTR(lcRGBData, (lnRow * tnWidth + j) * 3 - 1, 1) && B
lcBGRRow = lcBGRRow + SUBSTR(lcRGBData, (lnRow * tnWidth + j) * 3 - 0, 1) && G
lcBGRRow = lcBGRRow + SUBSTR(lcRGBData, (lnRow * tnWidth + j) * 3 - 2, 1) && R
ENDFOR
= FWRITE(lnFileHandle, lcBGRRow)
IF lnBMPRowSize > lnRowSize
= FWRITE(lnFileHandle, REPLICATE(CHR(0), lnBMPRowSize - lnRowSize))
ENDIF
ENDFOR
= FCLOSE(lnFileHandle)
RETURN .T.
ENDFUNC
* [color=#808080]============================================[/color]
* [color=#800000]4. 主函数:生成条码并保存为 BMP 文件(带留白控制)[/color]
* [color=#808080]============================================[/color]
FUNCTION CreateBarcode(tcContent, tnFormat, tnScale, tcOutputPath, tnMargin)
LOCAL pCreator, pBarcode, pWriter, pImage
LOCAL lnWidth, lnHeight, lnDataPtr, lnDataSize
LOCAL lcPixelData, lResult
* 参数检查
IF EMPTY(tcContent) OR EMPTY(tcOutputPath)
RETURN .F.
ENDIF
IF tnScale < 1
tnScale = 3
ENDIF
* 留白边距(像素),默认 20
IF EMPTY(tnMargin) OR tnMargin < 0
tnMargin = 20
ENDIF
* 1. 创建 CreatorOptions 并设置格式
pCreator = ZXing_CreatorOptions_new(tnFormat)
IF pCreator = 0
RETURN .F.
ENDIF
* 2. 生成条码对象
pBarcode = ZXing_CreateBarcodeFromText(tcContent, LEN(tcContent), pCreator)
IF pBarcode = 0
ZXing_CreatorOptions_delete(pCreator)
RETURN .F.
ENDIF
* 3. 创建 WriterOptions 并配置
pWriter = ZXing_WriterOptions_new()
IF pWriter = 0
ZXing_Barcode_delete(pBarcode)
ZXing_CreatorOptions_delete(pCreator)
RETURN .F.
ENDIF
ZXing_WriterOptions_setScale(pWriter, tnScale)
ZXing_WriterOptions_setAddQuietZones(pWriter, 1) && 启用内部静区
* 4. 渲染图片
pImage = ZXing_WriteBarcodeToImage(pBarcode, pWriter)
IF pImage = 0
ZXing_WriterOptions_delete(pWriter)
ZXing_Barcode_delete(pBarcode)
ZXing_CreatorOptions_delete(pCreator)
RETURN .F.
ENDIF
* 5. 获取图片数据(灰度格式)
lnWidth = ZXing_Image_width(pImage)
lnHeight = ZXing_Image_height(pImage)
lnDataPtr = ZXing_Image_data(pImage)
lnDataSize = lnWidth * lnHeight
lcPixelData = SYS(2600, lnDataPtr, lnDataSize)
* 6. 添加留白(手动扩展画布)
IF tnMargin > 0
lcPixelData = AddMargin(lcPixelData, lnWidth, lnHeight, tnMargin)
lnWidth = lnWidth + tnMargin * 2
lnHeight = lnHeight + tnMargin * 2
ENDIF
* 7. 保存为 BMP
lResult = SaveGrayAsBMP(lcPixelData, lnWidth, lnHeight, tcOutputPath)
* 8. 释放资源
ZXing_Image_delete(pImage)
ZXing_WriterOptions_delete(pWriter)
ZXing_Barcode_delete(pBarcode)
ZXing_CreatorOptions_delete(pCreator)
RETURN lResult
ENDFUNC
* [color=#808080]============================================[/color]
* 辅助函数:给图片四周添加空白边距
* [color=#808080]============================================[/color]
FUNCTION AddMargin(tcPixelData, tnWidth, tnHeight, tnMargin)
LOCAL lnNewWidth, lnNewHeight, lnNewSize, lcNewData
LOCAL lnRow, lcWhiteRow, lcDataRow
lnNewWidth = tnWidth + tnMargin * 2
lnNewHeight = tnHeight + tnMargin * 2
lnNewSize = lnNewWidth * lnNewHeight
* 创建全白背景(灰度值 255 = 白色)
lcNewData = REPLICATE(CHR(255), lnNewSize)
* 将原图复制到中间位置
FOR lnRow = 0 TO tnHeight - 1
* 原图当前行数据
lcDataRow = SUBSTR(tcPixelData, lnRow * tnWidth + 1, tnWidth)
* 在新图中的起始位置(顶部留白 + 当前行)
lnNewPos = (tnMargin + lnRow) * lnNewWidth + tnMargin + 1
* 复制数据到新图
lcNewData = STUFF(lcNewData, lnNewPos, tnWidth, lcDataRow)
ENDFOR
RETURN lcNewData
ENDFUNC
* [color=#808080]============================================[/color]
* 一键生成并打开(带留白参数)
* [color=#808080]============================================[/color]
FUNCTION QuickBarcode(tcContent, tnFormat, tnScale, tcOutputPath, tnMargin)
IF EMPTY(tnMargin)
tnMargin = 20 * 默认留白 20 像素
ENDIF
IF CreateBarcode(tcContent, tnFormat, tnScale, tcOutputPath, tnMargin)
= OpenBarcode(tcOutputPath)
RETURN .T.
ENDIF
RETURN .F.
ENDFUNC
* [color=#808080]============================================[/color]
* [color=#800000]5. 辅助函数:用系统默认程序打开图片[/color]
* [color=#808080]============================================[/color]
FUNCTION OpenBarcode(tcFilePath)
IF FILE(tcFilePath)
DECLARE Integer ShellExecute IN shell32.dll Integer, String, String, String, String, Integer
= ShellExecute(0, "open", tcFilePath, "", "", 1)
RETURN .T.
ELSE
RETURN .F.
ENDIF
ENDFUNC
* [color=#808080]============================================[/color]
* [color=#800000]6. 一键生成并打开[/color]
* [color=#808080]============================================[/color]
FUNCTION QuickBarcode(tcContent, tnFormat, tnScale, tcOutputPath)
IF CreateBarcode(tcContent, tnFormat, tnScale, tcOutputPath)
= OpenBarcode(tcOutputPath)
RETURN .T.
ENDIF
RETURN .F.
ENDFUNC
* [color=#808080]============================================[/color]
* [color=#800000]7. 测试示例[/color]
* [color=#808080]============================================[/color]
PROCEDURE TestAllFormats()
CLEAR
? "========== 条码生成测试 =========="
? ""
* 测试二维码
? "1. 生成 QR Code..."
= QuickBarcode("https://www., ZX_FORMAT_QRCODE, 4, "C:\test_qrcode.bmp")
* 测试 Code128
? "2. 生成 Code 128..."
= QuickBarcode("ABC12345678", ZX_FORMAT_CODE128, 3, "C:\test_code128.bmp")
* 测试 Aztec
? "3. 生成 Aztec..."
= QuickBarcode("AZTEC TEST", ZX_FORMAT_AZTEC, 4, "C:\test_aztec.bmp")
* 测试 DataMatrix
? "4. 生成 Data Matrix..."
= QuickBarcode("DATAMATRIX TEST", ZX_FORMAT_DATAMATRIX, 4, "C:\test_datamatrix.bmp")
* 测试 PDF417
? "5. 生成 PDF417..."
= QuickBarcode("PDF417 TEST", ZX_FORMAT_PDF417, 3, "C:\test_pdf417.bmp")
* 测试 EAN-13
? "6. 生成 EAN-13..."
= QuickBarcode("5901234123457", ZX_FORMAT_EAN13, 3, "C:\test_ean13.bmp")
? ""
? "========== 测试完成 =========="
ENDPROC
生成效果图
图片附件: 游客没有浏览图片的权限,请
登录 或
注册
图片附件: 游客没有浏览图片的权限,请
登录 或
注册
图片附件: 游客没有浏览图片的权限,请
登录 或
注册
图片附件: 游客没有浏览图片的权限,请
登录 或
注册
图片附件: 游客没有浏览图片的权限,请
登录 或
注册
图片附件: 游客没有浏览图片的权限,请
登录 或
注册