Как мне написать Каирскую поверхность в png к stdout? - PullRequest
2 голосов
/ 02 июля 2011

Я пытаюсь написать CGI-программу, которая будет выводить изображение PNG на стандартный вывод. Я уже могу сделать это из файла изображения (в формате PNG или иным способом), но теперь я использую Cairo для динамической генерации некоторого изображения и вывода его в браузер.

Проблема, с которой я сталкиваюсь, заключается в следующем: способ, которым Каир записывает поверхность в PNG, использует одну из двух функций. Первым является Surface :: write_to_png (строка имени файла). Это не работает для меня, так как я пишу не в файл, а на стандартный вывод. Вторым является Surface :: write_to_png_stream (что-то или другое write_func), как описано здесь . Я не понимаю, как это работает, или даже если это то, что я хочу. Есть ли лучший способ сделать это, и если нет, то как мне использовать эту ужасную функцию?

Спасибо

Ответы [ 2 ]

1 голос
/ 02 июля 2011

Как сказано в документации, напишите функцию для написания:

#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);
0 голосов
/ 03 июля 2011

Для тех, кому нужен ответ на этот вопрос (если вы существуете), я понял это:

Керрек на самом деле получает большую часть кредита здесь, но я думал, что опубликую свои результаты, и что в итоге сработало. Вот функция записи:

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

По сути, это нормальная поверхность. В любом случае, еще раз спасибо Керреку за ответ, и я надеюсь, что это кому-нибудь поможет.

...