【问题标题】:How do I write a Cairo surface to png to stdout?如何将 Cairo 表面写入 png 到标准输出?
【发布时间】:2013-03-11 05:50:09
【问题描述】:

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

我面临的问题是:Cairo 将表面写入 PNG 的方式是使用两个函数之一。第一个是 Surface::write_to_png(string filename)。这对我不起作用,因为我不是在写入文件,而是写入标准输出。第二个是 Surface::write_to_png_stream(something-or-other write_func),如 here 所述。我不明白这是如何工作的,或者即使这是我想要的。有没有更好的方法来实现这一点,如果没有,我该如何使用这个糟糕的功能?

谢谢

【问题讨论】:

  • 那么,这是怎么回事,它有效吗?
  • @Kerrek SB:嘿,我今天才看到你的评论,对此感到抱歉。无论如何,是的,我让它工作了,我在底部写了一个答案。谢谢!
  • 注意:write-func 参数实际上是一个 sigc::slot,也就是所谓的“委托”,即。您还可以从一个对象及其成员函数之一创建一个插槽,而不仅仅是一个普通的 C 函数。

标签: c++ linux cgi cairo


【解决方案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);

【讨论】:

  • 嗯,什么是“错误状态”?
  • 这是 Cairo 定义的类型。检查文档。不过,如果你这样写,它应该可以工作。
  • 不,它没有。我也是这么想的,但是编译器特别抱怨它,说“'ErrorStatus'没有命名类型”。然而,开罗的其他一切都有效。
  • 可能缺少类或命名空间,正如我所说,检查文档。这绝对是一种类型。如果你真的想要我,我可以为你做。你试过Cairo::ErrorStatus吗?
  • @Hassan:是的,绝对是Cairo::ErrorStatus。已编辑。
【解决方案2】:

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

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 的回答,我希望对某人有所帮助。

【讨论】:

  • 哦好的,表面是指针。凉爽的。在我的版本中,我测试cout::write 是否返回我们打算写入的实际长度,因为它应该返回写入的字节数。在你的情况下,你只检查你是否写了至少一个字节。不过,我想它在大多数情况下都会起作用。
猜你喜欢
  • 2014-07-03
  • 2018-03-14
  • 1970-01-01
  • 1970-01-01
  • 2012-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多