Question

I am starting to use ImageMagick and the MagickWand API in a simple C program. Right now, as a test, I am just looking for black pixels in a frame. Here is my code :

int find_black_pixel(MagickWand *wand) {
    int res = 0;
    PixelIterator * iterator = NewPixelIterator(wand);
    size_t width=MagickGetImageWidth(wand);
    size_t height=MagickGetImageHeight(wand);
    PixelWand ** pixels;
    unsigned long x,y;
    unsigned int alpha;
    unsigned int red, green, blue;

    //printf("Width : %d, Height : %d\n", (int)width, (int)height);

    for (y=0; y<height; y++) {
        pixels = PixelGetNextIteratorRow(iterator, &width);
        for (x=0; x<width; x++) {

            alpha = (unsigned int) (255*PixelGetAlpha(pixels[x]));
            if (alpha == 0)
                continue;

            red = (unsigned int) (255*PixelGetRed(pixels[x]));
            green = (unsigned int) (255*PixelGetGreen(pixels[x]));
            blue = (unsigned int) (255*PixelGetBlue(pixels[x]));

            //printf("At %04ld,%04ld, alpha : %d, rgb : %d,%d,%d\n", x,y,alpha, red, green, blue);

            if ((red ==0) || (green == 0) || (blue ==0)) {

                res = 1;
                //DestroyPixelWands(pixels, width);
                goto finished_find_black_pixel;
            }

        }
        //DestroyPixelWands(pixels, (size_t)width);
    }

finished_find_black_pixel:
    DestroyPixelIterator(iterator);

    return res;
}

If I uncomment any of the DestroyPixelWands call, I get an assertion :

test: wand/pixel-wand.c:283: DestroyPixelWands: Assertion `(*wand)->signature == 0xabacadabUL' failed.

Any idea why this is happening ?

EDIT :

More debugging... Even calling DestroyPixelWand(pixels[0]); makes it fail the same way...

Was it helpful?

Solution

I suspect that pixels is not a separate destroyable object (it is just a pointer into the original wand object) and that your current code is fine without any code to destroy pixels.

OTHER TIPS

Got the answer from ImageMagick forum :

The pixel wands are private when associated with a pixel iterator. The pixel wands are destroyed when you destroy the pixel iterator. Do not use DestroyPixelWands() for a pixel iterator.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top