如何使用C代码生成图像

时间:2011-04-12 06:31:01

标签: c bmp

下面的函数在调用html时只提供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));   
}

我在Web浏览器上的输出将通过一个简单的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));   
}

引用Dan的回答,十六进制数据如下:

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 个答案:

答案 0 :(得分:4)

这是一个1x1黑色windows bmp图像的xxd转储:

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                 ..........

答案 1 :(得分:0)

扩展@Dan D.所说的,您可以在Linux(或可能还有Windows)框中使用ImageMagick的“转换”命令将原始数据转换为图像。我用.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                 ..........

答案 2 :(得分:0)

要打印出来,您需要创建一个数组 例如unsigned char bmp [] = { 并在此处用十六进制填充此部分。但是因为它是十六进制的,所以需要在每对数字的前面添加0x。 例如。 0x42,0x4d 等等。 这可以包含在{}括号中。 例如。 unsigned char bmp[] ={ 0x42, 0x4d, 0x.... } 然后使用write函数通过套接字发送它。 write(socket,bmp,sizeof(bmp));