c - ImageMagick逐行(或逐 strip )写入图像文件

标签 c imagemagick rgb raster magickwand

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

output.png

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

关于c - ImageMagick逐行(或逐 strip )写入图像文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43008557/

相关文章:

c - 在 C 中初始化结构数组没有按预期工作

c - 将正 double 型强制转换为 unsigned int 实现是已定义的还是可移植的?

batch-file - 有运行时间限制吗?

c++ - 颜色空间 - RGB 和 YCbCr 问题

python - 强制 Pillow 生成 TrueColor 类型的图像,而我只使用黑白

c - 自由矩阵的动态矩阵问题

vector 的并发性,其中每个单元格在 32 位架构上为 8 位

php - 安全使用 ImageMagick 转换

imagemagick - 使用ImageMagick和 'textcleaner'清理OCR图像

ffmpeg - 从 AVFrame 复制一个矩形区域 - ffmpeg