0

我开始在一个简单的 C 程序中使用 ImageMagick 和 MagickWand API。现在,作为测试,我只是在帧中寻找黑色像素。这是我的代码:

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;
}

如果我取消注释任何DestroyPixelWands呼叫,我会得到一个断言:

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

知道为什么会这样吗?

编辑 :

更多调试......即使调用也会DestroyPixelWand(pixels[0]);以同样的方式失败......

4

2 回答 2

0

从 ImageMagick论坛得到答案:

当与像素迭代器关联时,像素棒是私有的。当您销毁像素迭代器时,像素棒将被销毁。不要将 DestroyPixelWands() 用于像素迭代器。

于 2011-09-06T18:06:49.887 回答
0

我怀疑这pixels不是一个单独的可销毁对象(它只是指向原始wand对象的指针),并且您当前的代码很好,没有任何要销毁的代码pixels

于 2011-09-02T00:12:41.687 回答