简体   繁体   中英

Get binary data from image using Magick Wand API

I am trying to get an image in binary data so that I can base64 encode it. I am using the MagickGetImageBlob() of the Magick Wand API but the Blob I am receiving does not contain the entire information.

My code is as follows. opt and enc are two structs containing user provided parameters and encoding information respectively. The library I am using to encode in base64 is this .

void WriteImg(UserDefinedOptions *options, MyStruct *enc, char *format){

    MagickWand *wand;
    char *outputPath;
    unsigned char *buffer = malloc(sizeof(char)*1000);
    size_t length;
    int flen;

    MagickWandGenesis();

    wand = NewMagickWand();

    MagickConstituteImage(wand, enc->image->width, enc->image->height,
            "RGB", CharPixel, enc->image->pxl);

    MagickSetImageResolution(wand, (double) options->dpi, (double) options->dpi);
    MagickSetImageUnits(wand, PixelsPerInchResolution);

    MagickSetImageFormat(wand, format);

    outputPath = (options->outputPath == NULL) ? "-" : options->outputPath;

    MagickWriteImage(wand, outputPath);  // This works and generates correct image


    buffer = MagickGetImageBlob(wand, &length); // Incomplete binary data
    /* Encode base64 */
    encbuffer = base64(buffer, strlen((const char *)buffer), &flen);    
    printf("Base64:%s\n", encbuffer);  

    CleanupMagick(&wand, DmtxFalse);

    MagickWandTerminus();

}

What am I doing wrong? Is there a better way to get the base64 encoded string from the image using Magick Wand?

The second parameter to base64() should be length , not the return value of strlen() .

/* Encode base64 */
encbuffer = base64(buffer, length, &flen); 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM