#pragma once // API for image process // // created on 2022-03-01 // #include "huagao/hgscanner_error.h" #include "common_setting.h" #include #include #include #include "../ImageProcess/ImageApplyHeaders.h" //#include class tiny_buffer; namespace hg_imgproc { typedef struct _img_data { int img_fmt; // 图片格式(BMP、PNG……,暂时未用) int width; // 行宽度(像素数) int height; // 高度(像素数) int line_bytes; // 每行的字节数 int bits; // 每个像素的位深 bool is_bw; // 是否为黑白图片,由图像处理模块设置 unsigned bytes; // 图像数据字节数(buf中的字节数) void* ip_data; // 图像处理模块的自定义数据,调用者不要随意更改此值!!! void* buf; // 图像数据信息 }IMGDATA, *LPIMGDATA; // 用于释放图像处理模块返回的各种动态内存, mem[i] == NULL 时终止,下列相同参数均照此规则 void imgproc_free_memory(LPIMGDATA* mem); // 所有函数均返回“int”值,代表错误代码, 0为成功,其它错误码由图像处理模块开发者定义 // Function: 用于将原始数据(如图像文件内容),解码为target_fmt指定的图像格式 // // Parameters: raw - 原始的图像数据 // // bytes - raw中数据字节数 // // bits - 位深 // // out - 用于接收解码后的图像数据。由图像处理模块分配内存,调用者调用imgproc_free_memory释放 // // Return: 错误码 // // NOTE: 该函数返回的out结构体中,buf为图像处理的中间数据类型(如cv::mat*),要想获取最终的图片数据, // 需要再调用 imgproc_final 函数进行转换 int imgproc_decode(void* buf, unsigned bytes, int bits, LPIMGDATA** out); // Function: 将倾斜的文本校正 // // Parameters: raw - [in]: 原始的图像数据,*raw == NULL时终止 // // [out]: 最终的图像数据 // // out - 用于接收解码后的图像数据。由图像处理模块分配内存,调用者调用imgproc_free_memory释放 // // dpi - 图片DPI // // double_face - 是否双面 // // Return: 错误码 int imgproc_correct_text(LPIMGDATA** raw, int dpi, bool double_face); // 适用于raw从其它图像处理函数返回的情况 int imgproc_correct_text(LPIMGDATA* raw, LPIMGDATA** out, int dpi, bool double_face); // 适用于raw从文件或者内存中转换而来 // Function: 自动匹配颜色 // // Parameters: raw - [in]: 原始的图像数据,*raw == NULL时终止 // // [out]: 最终的图像数据 // // out - 用于接收解码后的图像数据。由图像处理模块分配内存,调用者调用imgproc_free_memory释放 // // double_face - 是否双面 // // Return: 错误码 int imgproc_auto_adjust_color(LPIMGDATA** raw, bool double_face); // 适用于raw从其它图像处理函数返回的情况 int imgproc_auto_adjust_color(LPIMGDATA* raw, LPIMGDATA** out, bool double_face); // 适用于raw从文件或者内存中转换而来 // Function: 图像拆分 // // Parameters: raw - [in]: 原始的图像数据,*raw == NULL时终止 // // [out]: 最终的图像数据 // // out - 用于接收解码后的图像数据。由图像处理模块分配内存,调用者调用imgproc_free_memory释放 // // Return: 错误码 int imgproc_split(LPIMGDATA** raw); // 适用于raw从其它图像处理函数返回的情况 int imgproc_split(LPIMGDATA* raw, LPIMGDATA** out); // 适用于raw从文件或者内存中转换而来 // Function: 多流输出 // // Parameters: raw - [in]: 原始的图像数据,*raw == NULL时终止 // // out - 用于接收解码后的图像数据。由图像处理模块分配内存,调用者调用imgproc_free_memory释放 // // dpi - 图片DPI // // double_face - 是否双面 // // Return: 错误码 int imgproc_multi_out(LPIMGDATA* raw, LPIMGDATA** out, int dpi, bool double_face); enum { TARGET_FORMAT_GRAY = 1 << 0, TARGET_FORMAT_BLACK_WHITE = 1 << 1, TARGET_FORMAT_RGB = 1 << 2, }; // Function: 用于将图像处理过程的中间态数据,转换为最终的图片数据 // // Parameters: raw - [in]: 原始的图像数据,*raw == NULL时终止,通常该变量是由其它图像处理函数返回的 // // [out]: 最终的图像数据 // // target_fmt - 预期解码到的格式,TARGET_FORMAT_xxx // // Return: 错误码 int imgproc_final(LPIMGDATA** raw, int target_fmt, int dpi); //////////////////////////////////////////////////////////////////////////////// // NEW,flow ... // // 1 - call init to initialize an image processing object handle HIMGPRC // // 2 - call load_buffer or load_file to load raw data // // 3 - call image-processing methods // // 4 - repeat step-3 // // 5 - call final to got outputing data // // 6 - call get_final_data to get outputing data, while return SCANNER_ERR_NO_DATA // // 7 - call release to free the HIMGPRC handle // //////////////////////////////////////////////////////////////////////////////// typedef void* HIMGPRC; typedef struct _img_proc_param { int dpi; int bits; // 单分量位深 int channels; int color_mode; bool double_side; bool black_white; bool cis_image; //设置原图 int width; // in pixel int height; // in pixel unsigned total_bytes;// total bytes bool is_sup_real_300dpi_; bool is_sup_real_600dpi_; bool device_7010; }IMGPRCPARAM, *LPIMGPRCPARAM; typedef struct _img_header { int width; // in pixel int height; // in pixel int bits; // per channel int channels; // RGB - 3; GRAY - 1; ... int line_bytes; // bytes of ONE line unsigned total_bytes;// total bytes SANE_Image_Statu statu; // added on 2022-07-23 }IMGHEAD, *LPIMGHEAD; HIMGPRC init(int pid, bool isx86Advan_); int load_buffer(HIMGPRC himg,std::shared_ptr buff); int load_file(HIMGPRC himg, const char* path_file); //图像数据转换 int decode(HIMGPRC himg,int pid, LPSCANCONF img_param, LPIMGPRCPARAM param, std::map& correction_image_map_); int correct_text(HIMGPRC himg); int init_auto_txt_hanld(HIMGPRC himg); int free_auto_txt_hanld(HIMGPRC himg); //拆分 int split(HIMGPRC himg,int split3399); int fadeback(HIMGPRC himg); int multi_out(HIMGPRC himg,int out_type, int bw_threshold); int multi_out_red(HIMGPRC himg); int auto_matic_color(HIMGPRC himg,int color_type); int auto_crop(HIMGPRC himg, float dpi); int dispersion(HIMGPRC himg); int fillhole(HIMGPRC himg, float top, float low, float r, float l); int resolution_change(HIMGPRC himg,float dpi3288); int croprect(HIMGPRC himg); int channel(HIMGPRC himg); int adjust_color(HIMGPRC himg, unsigned char* table = nullptr, int tableLength = 0/*default value is to adjust color, or apply custom gamma*/); int antiInflow(HIMGPRC himg,int permeate_lv); int colorCorrection(HIMGPRC himg); int orentation(HIMGPRC himg); int textureRemove(HIMGPRC himg); int remove_morr(HIMGPRC himg); int sharpenType(HIMGPRC himg); int nosieDetach(HIMGPRC himg); int errorextention(HIMGPRC himg, int bw_threshold); int discardBlank(HIMGPRC himg); int answerSheetFilterRed(HIMGPRC himg); int imgtypechange(HIMGPRC himg,std::string img_type_,void *buf,std::vector &bmpdata); int fold(HIMGPRC himg); int quality(HIMGPRC himg,int dpi); int ocr_auto_txtdirect(HIMGPRC himg); int tesseract_auto_txtdirect(HIMGPRC himg); int size_detection(HIMGPRC himg); int cis_test_image(HIMGPRC himg, CISTestImageProcess::CISTestResult& res); int color_cast_correction(HIMGPRC himg); int lost_frame_test(HIMGPRC himg); int final(HIMGPRC himg); int correction_image(HIMGPRC himg, cv::Mat& flat_lut, cv::Mat black_mat, cv::Mat white_mat); // pimh must not to be NULL, and pimh->total_bytes indicates the length of 'buf' // // if 'buf' was NULL, then return SCANNER_ERR_INSUFFICIENT_MEMORY // // index is ZERO-base, if index is valid, fill the 'pimh' first, and copy data to buf if it was not NULL // return SCANNER_ERR_NO_DATA if it was out of range // // return SCANNER_ERR_OK if index has valid image data and buf is large enough int get_final_data(HIMGPRC himg, LPIMGHEAD pimh, void** buf, int index = 0); int get_final_data(HIMGPRC himg, LPIMGHEAD pimh, std::vector* buf, int index); void dump_2_file(HIMGPRC himg, const char* local_file); void release(HIMGPRC himg); // seperate utilites ... int convert_image_file(SANE_ImageFormatConvert* conv); int save_2_bmp_file(const char* bmp_file, LPIMGHEAD head, void* buf, int resolution); std::string bmp8_2_1bit(const unsigned char* data, int w, int h, int line_len, int threshold, bool reverse, bool align); }