Как сгенерировать изображение с использованием кода C - PullRequest
1 голос
/ 12 апреля 2011

Приведенная ниже функция просто обслуживает html при вызове, однако

void generateHTML (int socket) {
   char* message;

   // Sends HTTP response header

   message = "HTTP/1.0 200 OK\r\n"
                "Content-Type: text/html\r\n"
                "\r\n";
   printf ("about to send=> %s\n", message);
   write (socket, message, strlen (message));

   message = "<HTML><BODY><P>Hello World.</P></BODY></HTML>\n";
   printf ("about to send=> %s\n", message);
   write (socket, message, strlen (message));   
}

Мой вывод в веб-браузере будет простым сообщением Hello World. Однако я хочу изменить его так, чтобы вместо него отображалось растровое изображение. Давайте использовать красный пиксель 1x1 в качестве нашего BMP.

Я изменил эту функцию до сих пор:

void generateHTML (int socket) {
   char* message;

   // Sends HTTP response header

   message = "HTTP/1.0 200 OK\r\n"
                "Content-Type: image/bmp\r\n"
                "Content-Length: ???WTF???\r\n";
   printf ("about to send=> %s\n", message);
   write (socket, message, strlen (message));

   message = "BMF8\n";
   printf ("about to send=> %s\n", message);
   write (socket, message, strlen (message));   

   message = " "; //bmp file data goes here.
   printf ("about to send=> %s\n", message);
   write (socket, message, strlen (message));   
}

Цитируя ответ Дэна, данные в шестнадцатеричном формате выглядят так:

0000000: 424d 3a00 0000 0000 0000 3600 0000 2800  BM:.......6...(.
0000010: 0000 0100 0000 0100 0000 0100 1800 0000  ................
0000020: 0000 0400 0000 130b 0000 130b 0000 0000  ................
0000030: 0000 0000 0000 0000 0000                 ..........

Однако я просто не могу поместить это в кавычки. Как бы я это сделал?

Ответы [ 3 ]

4 голосов
/ 12 апреля 2011

это xxd дамп 1x1 чёрного окна в формате BMP:

0000000: 424d 3a00 0000 0000 0000 3600 0000 2800  BM:.......6...(.
0000010: 0000 0100 0000 0100 0000 0100 1800 0000  ................
0000020: 0000 0400 0000 130b 0000 130b 0000 0000  ................
0000030: 0000 0000 0000 0000 0000                 ..........
0 голосов
/ 28 апреля 2013

Чтобы распечатать его, вам нужно создать массив, например unsigned char bmp [] = {и заполнить эту часть здесь шестнадцатеричным числом выше.Однако, поскольку он находится в шестнадцатеричном формате, вам нужно добавить 0x перед каждой парой чисел.Например, 0x42, 0x4d и т. Д. Это можно просто включить в {} скобки.Например, unsigned char bmp[] ={ 0x42, 0x4d, 0x.... }, затем просто отправьте это через сокет, используя функцию записи.запись (сокет, bmp, sizeof (bmp));

0 голосов
/ 12 апреля 2011

расширяя сказанное @Dan D., вы можете использовать команду ImageMagick «конвертировать» в окне Linux (или, возможно, также в Windows) для преобразования необработанных данных в изображение.Я протестировал с .png, вам придется проверить вывод на Windows самостоятельно:

jcomeau@intrepid:~$ echo -en "\0000" | convert -size 1x1 -depth 8 gray:- /tmp/1black.bmp
jcomeau@intrepid:~$ xxd /tmp/1black.bmp 
0000000: 424d 3a00 0000 0000 0000 3600 0000 2800  BM:.......6...(.
0000010: 0000 0100 0000 0100 0000 0100 1800 0000  ................
0000020: 0000 0400 0000 120b 0000 120b 0000 0000  ................
0000030: 0000 0000 0000 0000 0000                 ..........
...