2014-03-04 79 views
0

我想使用ImageMagick(6.8.8-7)讀取SVG圖像並獲取有效的透明像素。MagickWand:透明的SVG部分呈現爲白色背景

下面的代碼與PNG格式一起工作良好,但對於SVG,我只能有一些白色背景。 所以我試圖添加MagickSetBackgroundColor和MagickSetImageBackgroundColor與一些合併圖層,但我仍然無法使它的作品。

下面從PoC的摘錄:使用PNG圖像

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

結果:使用SVG圖像

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

結果:

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

任何線索?

+0

MagickSetBackgroundColor()必須在MagickReadImage()之前調用, – user3377511

回答

0

我希望我明白你的問題。要將透明度從svg轉換爲png,必須將像素定義爲透明。 你可以使用「不透明度」在svg中定義透明度,但是在svg透明度中只給出下一層(不是alpha層,透過像alpha這樣的所有對象)。 如果你想PNG的alpha透明度,這是真正的最好的方式來定義(即白色),並將其設置爲alpha透明性