Magick ++ для отображения изображения с помощью CGI

Недавно я начал использовать Magick ++ (C ++ API для ImageMagick) с целью создания веб-сайта, который мог бы отображать случайно сгенерированные изображения. Я пытаюсь написать сценарий CGI, который будет создавать изображение JPEG, устанавливать цвет его пикселей, а затем возвращать информацию об изображении как Content-type: image/jpg.

Читая документацию, я нахожу только функции для записи файлов изображений на диск. Я не вижу ни одного, который делал бы то, что я надеюсь сделать, вроде std::cout << Image или std::cout << Blob

Моя цель - иметь возможность отображать изображение, созданное сценарием, на веб-странице без необходимости записывать изображение на диск.

Я знаю, что PerlMagick имеет функцию отображения, которая делает то, что я пытаюсь сделать - мне интересно, могу ли я сделать то же самое с Magick ++.


person Jonathan Basile    schedule 06.06.2015    source источник
comment
Я могу ошибаться, но я думаю, что, хотя и возможно, C ++ немного неудобен в качестве CGI, и большинство людей в настоящее время выберут Perl или PHP. Взгляните на мой ответ здесь stackoverflow.com/questions/28062426/   -  person Mark Setchell    schedule 06.06.2015
comment
Это может помочь ee.ryerson.ca/~courses / coe518 / LinuxJournal /   -  person Mark Setchell    schedule 06.06.2015
comment
Я работал с целыми числами с высокой точностью, поэтому Perl работает слишком медленно и неэффективно. Я создал веб-сайт, генерирующий случайный текст, полностью используя cgi (cgicc) на основе C ++, и он работает довольно хорошо. Так что я надеюсь, что смогу продолжить использовать его для этого проекта изображения.   -  person Jonathan Basile    schedule 06.06.2015
comment
Хорошо, извините, я недооценил ваш уровень опыта.   -  person Mark Setchell    schedule 06.06.2015
comment
Не беспокойтесь - я определенно новичок, когда дело касается работы с изображениями.   -  person Jonathan Basile    schedule 06.06.2015


Ответы (1)


Я думаю, вы ищете капли - большие двоичные объекты. По сути, вы создаете изображение типа Image и большой двоичный объект типа Blob. Вы заполняете свое изображение путем чтения из файла или генерации случайных данных, затем вы записываете свое изображение в большой двоичный объект (для его кодирования), а затем можете записать его в браузер пользователя.

Прошу прощения за мои бесполезные навыки C / C ++ ...

Image  image;
Blob   blob;

// set type to JPEG
image.magick("JPEG");   

// generate/read/fill image here
image.read("image.jpg");

// encode image as JPEG
image.write(&blob);   

// now send MIME type to browser
std::cout << "Content-type: image/jpeg" << CRLF;

// ... followed by blob
write(1,(char*)blob.data(),blob.length());
person Mark Setchell    schedule 06.06.2015
comment
Спасибо, Марк - мне все еще интересно, как обстоит дело с отправкой blob-объекта в браузер - это так просто, как std::cout << blob? или требуется другая функция? - person Jonathan Basile; 06.06.2015
comment
Я никогда не видел, чтобы это было сделано ... внутри Blob определены const void *data() и size_t length(), так что я думаю, вы получите их и передадите write(), но меня нет на моем компьютере, чтобы проверить. - person Mark Setchell; 06.06.2015
comment
Похоже, мое предположение было правильным, см. Здесь пример от spongemonkey ... imagemagick.org/discourse-server/viewtopic.php?t=24984 - person Mark Setchell; 06.06.2015
comment
это также код для записи в файл - я пытаюсь изменить его для работы с ostringstream, но я не уверен, как перевести строку outFile.write((char*)blob.data(),blob.length()); - person Jonathan Basile; 06.06.2015
comment
Это должно быть просто stdout, то есть дескриптор файла 1, как у меня. - person Mark Setchell; 06.06.2015
comment
Когда я включаю эту строку, я получаю ошибку 500 - я думаю, это сработает, только если данные blob могут быть записаны в поток ostring - person Jonathan Basile; 06.06.2015
comment
Кажется, сейчас это работает: streampunk.write((char*)bablob.data(),bablob.length()); std::cout << "Content-type: image/jpg\n\n"; std::cout << streampunk.str(); - Я до сих пор не смог передать эту информацию в источник элемента img, но я задам другой вопрос, если я не могу это понять. благодарю вас! - person Jonathan Basile; 06.06.2015
comment
Попробуйте запустить это в своем Терминале ... convert -size 640x416 xc:gray +noise random result.jpg :-) - person Mark Setchell; 08.06.2015