0

我正在尝试使用 ImageMagick (6.8.8-7) 读取 SVG 图像并获得有效的透明像素。

下面的代码适用于 PNG 格式,但对于 SVG,我只能有一些白色背景。所以我尝试添加 MagickSetBackgroundColor 和 MagickSetImageBackgroundColor 与一些合并层,但我仍然无法使其工作。

下面是 PoC 的摘录:

MagickWandGenesis();
m_wand = NewMagickWand();

MagickReadImage(m_wand, file_name);

hasAlfa = MagickGetImageAlphaChannel(m_wand);
fprintf(stderr, "alpha channel detection: %d\n", hasAlfa);

if (hasAlfa == MagickTrue) {

    PixelWand *color;
    MagickWand *new_wand;

    imagedata = malloc(w*h*4);

    color = NewPixelWand();
    PixelSetColor(color, "none");
    MagickSetBackgroundColor(m_wand, color);

    MagickSetImageBackgroundColor(m_wand, color);
    new_wand = MagickMergeImageLayers(m_wand, MergeLayer);
    DestroyMagickWand(m_wand);
    m_wand = new_wand;

    mrc = MagickExportImagePixels(m_wand, 0, 0, (size_t)w, (size_t)h, "RGBA", CharPixel, imagedata);

    fprintf(stderr, "R:%d G:%d B:%d A:%d\nR:%d G:%d B:%d A:%d\n", imagedata[0], imagedata[1], imagedata[2], imagedata[3], imagedata[4], imagedata[5], imagedata[6], imagedata[7]);
}

使用 PNG 图像的结果:

size: 9 x 11
alpha channel detection: 1
R:0 G:0 B:0 A:0
R:0 G:0 B:0 A:0

使用 SVG 图像的结果:

size: 640 x 1000
alpha channel detection: 1
R:255 G:255 B:255 A:255
R:255 G:255 B:255 A:255

有什么线索吗?

4

1 回答 1

0

我希望,我理解你的问题。要将透明度从 svg 转换为 png,必须将像素定义为透明。您可以使用“不透明度”在 svg 中定义透明度,但在 svg 中,透明度仅适用于下一层(不是 alpha 层,它会像 alpha 一样透过所有对象)。如果您想要 png 的 alpha 透明度,这确实是定义(即白色)并将其设置为 alpha transperency 的最佳方式

于 2014-10-05T21:09:25.937 回答