MagickWand для C, ошибка при вызове DestroyPixelWands - PullRequest
0 голосов
/ 02 сентября 2011

Я начинаю использовать ImageMagick и MagickWand API в простой C-программе. Прямо сейчас, в качестве теста, я просто ищу черные пиксели в кадре. Вот мой код:

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]); приводит к сбою таким же образом ...

Ответы [ 2 ]

0 голосов
/ 06 сентября 2011

Получил ответ от ImageMagick forum :

Пиксельные палочки являются частными, когда связаны с пиксельным итератором. Пиксельные палочки уничтожаются, когда вы уничтожаете пиксельный итератор. Не делайте используйте DestroyPixelWands () для пиксельного итератора.

0 голосов
/ 02 сентября 2011

Я подозреваю, что pixels не является отдельным разрушаемым объектом (это просто указатель на исходный wand объект) и что ваш текущий код в порядке без кода для уничтожения pixels.

...