如何将piro表面写入png到stdout?

时间:2011-07-02 18:53:26

标签: c++ linux cgi cairo

我正在尝试编写一个将PNG图像输出到stdout的CGI程序。我已经可以从图像文件(PNG或其他)中做到这一点,但现在我正在使用Cairo动态生成一些图像,然后将其输出到浏览器。

我面临的问题是:开罗将表面写入PNG的方式是使用两种功能之一。第一个是Surface :: write_to_png(字符串文件名)。这对我不起作用,因为我不是写入文件,而是写入stdout。第二个是Surface :: write_to_png_stream(某事或其他write_func),如here所述。我不明白这是如何工作的,或者即使这是我想要的。有没有更好的方法来实现这一目标,如果没有,我该如何使用这个糟糕的功能?

由于

2 个答案:

答案 0 :(得分:1)

正如文档中所述,编写一个函数来处理写作:

#include <cstdio> // for stdout

Cairo::ErrorStatus my_write_func(unsigned char* data, unsigned int length)
{
  return length == std::fwrite(data, length, stdout) ? CAIRO_STATUS_SUCCESS : CAIRO_STATUS_WRITE_ERROR;
}

用法:

my_surface.write_to_png_stream(my_write_func);

答案 1 :(得分:0)

对于那些需要回答这个问题的人(如果你有的话),我已经弄清楚了:

Kerrek实际上获得了大部分功劳,但我想我会发布我的结果,最终会有效。这是写函数:

Cairo::ErrorStatus write_stdout(const unsigned char* data, unsigned int length)
{
return std::cout.write((char*)data,length)?CAIRO_STATUS_SUCCESS:CAIRO_STATUS_WRITE_ERROR;
}

现在,我不知道这是否会在出错时返回CAIRO_STATUS_WRITE_ERROR,因为我不确定write的返回值是什么。但是,此代码确实有效。

要打电话,我用过:

surface->write_to_png_stream(&write_stdout);

surface定义如下:

Cairo::RefPtr<Cairo::ImageSurface> surface =
Cairo::ImageSurface::create(Cairo::FORMAT_ARGB32, WIDTH, HEIGHT);

基本上,这是一个正常的表面。无论如何,再次感谢Kerrek回答,我希望能帮助别人。