首页 > 解决方案 > 有没有办法从cpp中的文本生成条形码图像?

问题描述

我有一个在 CPP 中生成条形码编号的代码,为了在收据中显示它,我需要将该编号转换为图像(.bmp)。

是否有现有的库或实现上述结果的方法?

标签: c++imagebarcode

解决方案


这是我用来生成 Interleaved 2 of 5 条码的一些代码片段,这是最简单的一维条码。它只为数字而不是字母设置,但我相信你会明白的。

这规定了数字 0 到 9 的行距(包括 0 到 9)

const char I25_Code[10][6] = { {"NNWWN"}, {"WNNNW"}, {"NWNNW"}, {"WWNNN"}, {"NNWNW"}, {"WNWNN"}, {"NWWNN"}, {"NNNWW"}, {"WNNWN"}, {"NWNWN"} };

这将生成生成条形码:

void GenerateBarcodeI2of5(unsigned int startX, unsigned int startY, unsigned int width, unsigned int height, char *value)
{
    if(value==NULL)return;

    if(strlen(stringbuffer)==0) return;

    int minBarThickness = MIN_BARCODE_BAR_WIDTH;
    int barRatio = BARCODE_BAR_RATIO_3_TO_1 ? 3:2;

    bool bars = true;
    int sl = strlen(stringbuffer);
    int pixelX=0;
    pixelX=startX;
    for(int i=0;i<sl;i++)
    {
        char c = stringbuffer[i];
        if(bars)
        {
            if(c=='N' || c=='n')
            {
                GenerateLine(pixelX, startY, minBarThickness, height, false);
                pixelX+=minBarThickness;
            }
            else
            {
                GenerateLine(pixelX, startY, minBarThickness*barRatio, height, false);
                pixelX+=minBarThickness*barRatio;

            }
        }
        else
        {
            if(c=='N' || c=='n')
            {
                GenerateLine(pixelX, startY, minBarThickness, height, true);
                pixelX+=minBarThickness;
            }
            else
            {
                GenerateLine(pixelX, startY, minBarThickness*barRatio, height, true);
                pixelX+=minBarThickness*barRatio;                       
            }
        }
        bars=!bars;
    }
}

这里的前提是存在一个表示位图的字节数组,并且子函数在该字节数组中设置位,例如 SetPixel。

void GenerateLine(unsigned int startX, unsigned int startY, unsigned int width, unsigned int height, bool inverse)
{
    int bit = inverse?0:1;
    for(int x = startX; x<(width+startX); x++)
    {
        for(int y=startY; y<(startY+height); y++)
        {
            if(x>=IMAGE_COLUMNS) continue;
            if(y>=IMAGE_ROWS) continue;
            SetPixel(x,y,ScreenImageData,IMAGE_ARRAY_COLUMN_DATA_BYTES, bit);
        }
    }
}

推荐阅读