2011-07-29 42 views
10

我有一些代碼,看起來像這樣:如何使用cairo將圖像寫入SVG文件?

cairo_surface_t * surface = cairo_svg_surface_create("0.svg", 512, 512); 
cairo_t * context = cairo_create(surface); 

int * data = new int[512*512]; 

// fill the data... 

cairo_surface_t * image_surface = 
    cairo_image_surface_for_data(data, 512, 512, 512*4); 
cairo_set_source_surface(context, image_surface, 0, 0); 
cairo_paint(context); 

// do some other drawing ... 

cairo_surface_flush(surface); 
cairo_surface_finish(surface); 
cairo_surface_destroy(surface); 
cairo_destroy(context); 

然而,SVG總是出現損壞。圖像寫入不正確,下面的所有繪圖命令都不起作用。將表面類型更改爲PS,即:

cairo_surface_t * surface = cairo_ps_surface_create("0.ps", 512, 512); 

產生完全正確的PS文檔。 任何幫助修復SVG將不勝感激。

編輯:忘了提供版本信息。 cairo_version_string()給出的開羅1.10.2。 G ++ 4.52 運行在Ubuntu 11.04

EDIT(2):好吧,我跟開羅追查下來到PNG問題,發現如預期要麼cairo_surface_write_to_png不行爲。這個函數和嘗試在SVG中嵌入圖像都會導致「內存不足錯誤」,我仍然不知道爲什麼。

回答

2

看起來你可能已經忘記了指定SVG版本:創建曲面後立即

cairo_svg_surface_restrict_to_version (surface, CAIRO_SVG_VERSION_1_2); 

你可以做到這一點。

+0

謝謝,但這不能解決問題。看我的文章編輯。 – Scott

+0

好的。看看你的版本,這應該是'CAIRO_SVG_VERSION_1_1'。在PNG問題上,你可以'cairo_image_surface_create_from_png()',然後將曲面寫回新的PNG並讓文件損壞?或者這可以正常工作? – Seth

0

也許發佈生成的普通SVG可以提供幫助。

0

我在Cairo文檔中找不到cairo_image_surface_for_data。你的意思是cairo_image_surface_create_for_data?如果是這樣,則需要使用cairo_format_stride_for_width來計算陣列大小,並且位圖數據需要採用Cairo預期的格式。由於您的兩個輸出都已損壞,這強烈表明問題出在輸入

+0

@斯科特,你還在嗎?你有沒有試過塞思的建議,從PNG加載源表面? –

+0

我完全忘記了這個問題,對不起。我沒有解決它,但我發現與PNGs開羅在我的電腦上的其他項目工作正常。我認爲這是因爲我在這個項目中連接了Irrlicht和OpenCV,所以存在一些關於libpng版本使用的鏈接問題。 – Scott