如何将Cairo曲面写入png到stdout

How do I write a Cairo surface to png to stdout?

本文关键字:png stdout 曲面 Cairo      更新时间:2023-10-16

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

我面临的问题是:Cairo将曲面写入PNG的方式是使用两个函数中的一个。第一个是Surface::write_to_png(字符串文件名(。这对我不起作用,因为我不是在写文件,而是在stdout。第二个是Surface::write_to_png_stream(something或其他write_func(,如下所述。我不明白这是怎么回事,甚至不明白这是否是我想要的。有更好的方法来实现这一点吗?如果没有,我该如何使用这个糟糕的函数?

感谢

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

#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);

对于那些需要这个问题答案的人(如果你存在的话(,我已经找到了答案:

事实上,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的回答,我希望这能帮助到别人。