📄 dmtxwrite.c
字号:
fprintf(stdout, "libdmtx version %s\n", dmtxVersion()); exit(0); break; default: return DMTX_FAILURE; break; } } opt->inputPath = (*argvp)[optind]; /* XXX here test for incompatibility between options. For example you cannot specify dpi if PNM output is requested */ return DMTX_SUCCESS;}/** * * */static voidReadData(UserOptions *opt, int *codeBufferSize, unsigned char *codeBuffer){ int fd; /* Open file or stdin for reading */ fd = (opt->inputPath == NULL) ? 0 : open(opt->inputPath, O_RDONLY); if(fd == -1) FatalError(1, _("Error while opening file \"%s\""), opt->inputPath); /* Read input contents into buffer */ *codeBufferSize = read(fd, codeBuffer, DMTXWRITE_BUFFER_SIZE); if(*codeBufferSize == DMTXWRITE_BUFFER_SIZE) FatalError(1, _("Message to be encoded is too large")); /* Close file only if not stdin */ if(fd != 0 && close(fd) != 0) FatalError(1, _("Error while closing file"));}/** * @brief Display program usage and exit with received status. * @param status error code returned to OS * @return void */static voidShowUsage(int status){ if(status != 0) { fprintf(stderr, _("Usage: %s [OPTION]... [FILE]\n"), programName); fprintf(stderr, _("Try `%s --help' for more information.\n"), programName); } else { fprintf(stdout, _("Usage: %s [OPTION]... [FILE]\n"), programName); fprintf(stdout, _("\Encode FILE or STDIN and write Data Matrix barcode to desired format\n\\n\Example: %s message.txt -o message.png\n\Example: echo -n 123456 | %s -o message.png\n\\n\OPTIONS:\n"), programName, programName); fprintf(stdout, _("\ -c, --color=COLOR barcode color (not implemented)\n\ -b, --bg-color=COLOR background color (not implemented)\n\ -d, --module=NUM module size (in pixels)\n\ -m, --margin=NUM margin size (in pixels)\n\ -e, --encoding=[bfactxe8] encodation scheme; optimize for:\n\ b = Best optimized best possible optimization (beta)\n\ f = Fast optimized basic optimization (not implemented)\n\ a = ASCII [default] ASCII standard & extended\n\ c = C40 digits and uppercase\n\ t = Text digits and lowercase\n\ x = X12 ANSI X12 EDI\n\ e = EDIFACT ASCII values 32-94\n\ 8 = Base 256 all byte values 0-255\n")); fprintf(stdout, _("\ -f, --format=[pmac] image output format\n\ p = PNG [default] PNG image\n\ m = PNM PNM image\n\ a = ASCII ASCII art barcode (preview only)\n\ c = Codewords Codeword listing (preview only)\n\ -o, --output=FILE output filename (default standard output)\n\ -r, --rotate=DEGREES rotation angle (degrees)\n")); fprintf(stdout, _("\ -s, --symbol-size=SIZE symbol size in Rows x Cols\n\ Automatic SIZE options:\n\ s = Auto square [default]\n\ r = Auto rectangle\n\ Manually specified SIZE options for square symbols:\n\ 10x10, 12x12, 14x14, 16x16, 18x18, 20x20,\n\ 22x22, 24x24, 26x26, 32x32, 36x36, 40x40,\n\ 44x44, 48x48, 52x52, 64x64, 72x72, 80x80,\n\ 88x88, 96x96, 104x104, 120x120, 132x132, 144x144\n\ Manually specified SIZE options for rectangular symbols:\n\ 8x18, 8x32, 12x26, 12x36, 16x36, 16x48\n")); fprintf(stdout, _("\ -M, --mosaic create non-standard Data Mosaic barcode\n\ -R, --resolution=NUM set image print resolution (dpi)\n\ -v, --verbose use verbose messages\n\ -V, --version print version information\n\ --help display this help and exit\n")); fprintf(stdout, _("\nReport bugs to <mike@dragonflylogic.com>.\n")); } exit(status);}/** * * */static voidWriteImagePng(UserOptions *opt, DmtxEncode *enc){ FILE *fp; int row; int width, height; png_structp pngPtr; png_infop infoPtr; png_bytepp rowPointers; png_uint_32 pixelsPerMeter; /* Open file or stdin for writing */ fp = (opt->outputPath == NULL) ? stdout : fopen(opt->outputPath, "wb"); if(fp == NULL) { perror(programName); exit(3); } /* Create and initialize the png_struct with the desired error handler functions */ pngPtr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); if(pngPtr == NULL) { if(fp != stdout) fclose(fp); perror(programName); } /* Create and initialize image information struct */ infoPtr = png_create_info_struct(pngPtr); if(infoPtr == NULL) { if(fp != stdout) fclose(fp); png_destroy_write_struct(&pngPtr, png_infopp_NULL); perror(programName); } /* Set error handling */ if(setjmp(png_jmpbuf(pngPtr))) { if(fp != stdout) fclose(fp); png_destroy_write_struct(&pngPtr, &infoPtr); perror(programName); } width = dmtxImageGetProp(enc->image, DmtxPropWidth); height = dmtxImageGetProp(enc->image, DmtxPropHeight); /* Set up output control using standard streams */ png_init_io(pngPtr, fp); png_set_IHDR(pngPtr, infoPtr, width, height, 8, PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); if(opt->dpi > 0) { pixelsPerMeter = (png_uint_32)(39.3700787 * opt->dpi + 0.5); png_set_pHYs(pngPtr, infoPtr, pixelsPerMeter, pixelsPerMeter, PNG_RESOLUTION_METER); } rowPointers = (png_bytepp)png_malloc(pngPtr, sizeof(png_bytep) * height); if(rowPointers == NULL) { perror(programName); } /* This copy reverses row order top-to-bottom so image coordinate system corresponds with normal "right-handed" 2D space */ for(row = 0; row < height; row++) { rowPointers[row] = (png_bytep)png_malloc(pngPtr, png_get_rowbytes(pngPtr, infoPtr)); assert(png_get_rowbytes(pngPtr, infoPtr) == width * sizeof(DmtxRgb)); /* Flip rows top-to-bottom to account for PNM "top-left" origin */ memcpy(rowPointers[row], enc->image->pxl + (row * width), width * sizeof(DmtxRgb)); } png_set_rows(pngPtr, infoPtr, rowPointers); png_write_png(pngPtr, infoPtr, PNG_TRANSFORM_PACKING, NULL); /* Clean up after the write, and free any memory allocated */ png_destroy_write_struct(&pngPtr, &infoPtr); for(row = 0; row < height; row++) { png_free(pngPtr, rowPointers[row]); } png_free(pngPtr, rowPointers); rowPointers = NULL; if(fp != stdout) fclose(fp);}/** * * */static voidWriteImagePnm(UserOptions *opt, DmtxEncode *enc){ int row, col; int width, height; FILE *fp; DmtxRgb rgb; fp = (opt->outputPath == NULL) ? stdout : fopen(opt->outputPath, "wb"); if(fp == NULL) { perror(programName); exit(3); } width = dmtxImageGetProp(enc->image, DmtxPropWidth); height = dmtxImageGetProp(enc->image, DmtxPropHeight); /* Flip rows top-to-bottom to account for PNM "top-left" origin */ fprintf(fp, "P6 %d %d 255 ", width, height); for(row = height - 1; row >= 0; row--) { for(col = 0; col < width; col++) { dmtxImageGetRgb(enc->image, col, row, rgb); fwrite(rgb, sizeof(char), 3, fp); } } if(fp != stdout) { fclose(fp); }}/** * * */static voidWriteAsciiBarcode(DmtxEncode *enc){ int symbolRow, symbolCol; int moduleOnAll; moduleOnAll = DMTX_MODULE_ON_RED | DMTX_MODULE_ON_GREEN | DMTX_MODULE_ON_BLUE; fputc('\n', stdout); /* ASCII prints from top to bottom */ for(symbolRow = enc->region.symbolRows - 1; symbolRow >= 0; symbolRow--) { fputs(" ", stdout); for(symbolCol = 0; symbolCol < enc->region.symbolCols; symbolCol++) { fputs((dmtxSymbolModuleStatus(enc->message, enc->region.sizeIdx, symbolRow, symbolCol) & moduleOnAll) ? "XX" : " ", stdout); } fputs("\n", stdout); } fputc('\n', stdout);}/** * * */static voidWriteCodewords(DmtxEncode *enc){ int i, dataWordLength; dataWordLength = dmtxGetSymbolAttribute(DmtxSymAttribSymbolDataWords, enc->region.sizeIdx); for(i = 0; i < enc->message->codeSize; i++) { fprintf(stdout, "%c:%03d\n", (i < dataWordLength) ? 'd' : 'e', enc->message->code[i]); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -