如何将Cairo曲面写入png到stdout
How do I write a Cairo surface to png to stdout?
我正试图编写一个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的回答,我希望这能帮助到别人。
相关文章:
- 如何将stdout重定向到stderr
- 在CToolBar对象中使用PNG时出现问题
- 从存储为 Windows 资源 (c++) 的 png 中获取 png 文件数据
- 使用 stbi_write_png,如何将 0 和 1 的矩形字节数组转换为单色 png 文件?
- 将 FFMPEG 帧写入 png/jpeg 文件
- C++|以一种很好的方式将树(不一定是二进制的)打印到stdout
- 将位图 (bmp) 转换为具有透明度的 png (Windows c++)
- 是否可以将子进程的 stdout 重定向到父进程中的另一个文件?
- 尝试在 Windows 上重定向 stdout 和 stderr——_fileno(stdout) 返回 -2
- 如何启用libMagick++以保存.png文件格式
- Qt-png图像未显示在部署应用程序中
- 无法在CLion(macOS)上打开带有CImg的.png文件
- pybind11将python sys.stdout从print()重定向到c++
- 当使用带有stdin和stdout重定向的双进程管道时,如何避免stdin上的重复输入
- C++gdi::内存中的位图到PNG图像
- 如何将控制台(stdout)添加为g3log中的接收器
- 当我调用它来解码 Blob 对象中的 png 图像时,"Magick++::readImages"引发警告
- 如何将 2d 数组转换为 svg 或 png 格式的数独图像?
- 为什么PNG图像的stdout有时会在printf中刷新图像的一半
- 如何将Cairo曲面写入png到stdout