当前位置: 首页 > 工具软件 > ZBar > 使用案例 >

ZBar源码分析(七)

刘浩思
2023-12-01

2021SC@SDUSC

目录

一、zbar_image_write函数分析

二、Processor C++ wrapper分析


一、zbar_image_write函数分析

该函数将原始图像数据转储到文件以进行调试。

zimg_hdr_t hdr;

hdr.magic = 0x676d697a;
    hdr.format = img->format;
    hdr.width = img->width;
    hdr.height = img->height;
    hdr.size = img->datalen;

数据将以16字节头作为前缀,包括:

        4字节        uint=0x676d697a

        4字节        fourcc格式

        2字节        宽度

        2字节        高度

        4字节        图像数据的大小

int zbar_image_write (const zbar_image_t *img,
                      const char *filebase)

img是要转储的图像对象;filebase是文件名,格式为“.XXXX.zimg”,其中XXXX是fourcc的格式。

if(fwrite(&hdr, sizeof(hdr), 1, f) != 1 ||
       fwrite(img->data, 1, img->datalen, f) != img->datalen) {
#ifdef HAVE_ERRNO_H
        rc = errno;
        zprintf(1, "ERROR writing %s: %s\n", filename, strerror(rc));
#else
        rc = 1;
#endif
        fclose(f);
        goto error;
    }

    rc = fclose(f);

error:
    free(filename);
    return(rc);

成功时返回0,失败时返回系统错误代码。

二、Processor C++ wrapper分析

zbar的processor是一种高级独立图像处理器,负责处理条形码的视频和图像,可以选择将图像显示到库所有的输出窗口。

void init (const char *video_device = "",
               bool enable_display = true)
    {
        if(zbar_processor_init(_processor, video_device, enable_display))
            throw_exception(_processor);
    }

初始化processor,打开视频输入设备、准备显示输出。

void set_handler (Image::Handler& handler)
    {
        zbar_processor_set_data_handler(_processor, handler, &handler);
    }

设置结果处理程序回调。

int set_config (zbar_symbol_type_t symbology,
                    zbar_config_t config,
                    int value)
    {
        return(zbar_processor_set_config(_processor, symbology,
                                          config, value));
    }

将指示符号的配置设置为指定值。

int set_config (std::string cfgstr)
    {
        return(zbar_processor_parse_config(_processor, cfgstr.c_str()));
    }

设置从配置字符串解析的配置。

bool is_visible ()
    {
        int rc = zbar_processor_is_visible(_processor);
        if(rc < 0)
            throw_exception(_processor);
        return(rc != 0);
    }

检索输出窗口的当前状态。

void set_visible (bool visible = true)
    {
        if(zbar_processor_set_visible(_processor, visible) < 0)
            throw_exception(_processor);
    }

显示或隐藏库所拥有的显示窗口。

void set_active (bool active = true)
    {
        if(zbar_processor_set_active(_processor, active) < 0)
            throw_exception(_processor);
    }

在自由运行视频模式下控制处理器。

const SymbolSet get_results () const {
        return(SymbolSet(zbar_processor_get_results(_processor)));
    }

检索上次扫描图像的解码结果。

int user_wait (int timeout = FOREVER)
    {
        int rc = zbar_processor_user_wait(_processor, timeout);
        if(rc < 0)
            throw_exception(_processor);
        return(rc);
    }

等待用户对显示窗口的输入。

void process_one (int timeout = FOREVER)
    {
        if(zbar_process_one(_processor, timeout) < 0)
            throw_exception(_processor);
    }

从视频流开始处理,直到结果可用。

void process_image (Image& image)
    {
        if(zbar_process_image(_processor, image) < 0)
            throw_exception(_processor);
    }
Processor& operator<< (Image& image)
    {
        process_image(image);
        return(*this);
    }

处理提供的条形码图像。

void force_format (unsigned long input_format,
                       unsigned long output_format)
    {
        if(zbar_processor_force_format(_processor, input_format,
                                        output_format))
            throw_exception(_processor);
    }

void force_format (std::string& input_format,
                       std::string& output_format)
    {
        unsigned long ifourcc = zbar_fourcc_parse(input_format.c_str());
        unsigned long ofourcc = zbar_fourcc_parse(output_format.c_str());
        if(zbar_processor_force_format(_processor, ifourcc, ofourcc))
            throw_exception(_processor);
    }

用于调试/测试的强制特定输入和输出格式。

void request_size (int width, int height)
    {
        zbar_processor_request_size(_processor, width, height);
    }

从设备请求视频图像的首选大小。

void request_interface (int version)
    {
        zbar_processor_request_interface(_processor, version);
    }

请求用于调试/测试的首选驱动程序接口版本。

void request_iomode (int iomode)
    {
        if(zbar_processor_request_iomode(_processor, iomode))
            throw_exception(_processor);
    }

为调试/测试请求首选I/O模式。

 类似资料: