ImageMagick逐行(或逐条带)写入图像文件

ImageMagick to write image file row by row (or band by band)

ImageMagick (C API MagickWand) 是否具有使用 RGB 光栅数据生成图像文件(.jpg、.tif)的功能?

如果是这样,它是否也可以逐条生成图像文件,即一次写入几行直到写入整个图像?还是一次一行?

我相信您描述的是图像行迭代器。 ImageMagick 提供 PixelIterator methods 以允许遍历图像数据。

这是一个简单的例子。

#include <stdio.h>
#include <wand/MagickWand.h>

int main(int argc, const char * argv[]) {
    // Set up IM environment.
    MagickWandGenesis();

    // Prototype
    MagickWand * wand;
    PixelWand * bg;
    PixelIterator * iter;
    PixelWand ** row;
    MagickPixelPacket pixel;

    size_t
        x,
        y,
        row_width,
        width  = 200,
        height = 50;

    unsigned int
        seed = 0xABCD;

    // Allocate & initialize.
    wand = NewMagickWand();
    bg = NewPixelWand();

    // Create an empty image.
    PixelSetColor(bg, "WHITE");
    MagickNewImage(wand, width, height, bg);

    // Free color resource.
    bg = DestroyPixelWand(bg);

    srand(seed); // Seed random number.

    // Allocate & initialize pixel iterator
    iter = NewPixelIterator(wand);

    // Loop through all rows.
    for (y = 0; y < height; ++ y)
    {
        // Pull all pixels in a row.
        row = PixelGetNextIteratorRow(iter, &row_width);
        // Iterate over all pixels collected.
        for (x = 0; x < row_width; ++x)
        {
            // Copy pixel data to packet.
            PixelGetMagickColor(row[x], &pixel);
            // Set random colors.
            pixel.red   = rand() & QuantumRange;
            pixel.green = rand() & QuantumRange;
            pixel.blue  = rand() & QuantumRange;
            // Put data back to pixel from packet.
            PixelSetMagickColor(row[x], &pixel);
        }
        // Sync manipulated data on buffer back to image.
        PixelSyncIterator(iter);
    }

    /******************************
     Let's set row 16 to be all RED
     ******************************/
    PixelSetIteratorRow(iter, 15);
    row = PixelGetNextIteratorRow(iter, &row_width);
    for (x = 0; x < row_width; ++x)
    {
        PixelGetMagickColor(row[x], &pixel);
        pixel.red   = QuantumRange;
        pixel.green = 0;
        pixel.blue  = 0;
        PixelSetMagickColor(row[x], &pixel);
    }
    // Sync manipulated data on buffer back to image.
    PixelSyncIterator(iter);

    // Free iterator resorce.
    iter = DestroyPixelIterator(iter);

    MagickWriteImage(wand, "/tmp/output.png");
    // Free image data.
    wand = DestroyMagickWand(wand);

    MagickWandTerminus();
    return 0;
}

请注意,以上示例使用 ImageMagick 6。对于 ImageMagick 7,请查看 Porting Guide