2011-04-12 52 views
1

下面簡單的功能用於HTML時,它被稱爲生成圖像,但是如何用C代碼

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

但是,我根本無法把那句話裏面分數。我將如何做到這一點?

+2

這並不那麼簡單,請參閱http://en.wikipedia.org/wiki/BMP_file_format – 2011-04-12 06:34:54

+0

我已閱讀wiki文章,但仍遇到問題。只需要有人發佈一個黑色bmp像素的樣子。 – meiryo 2011-04-12 06:36:57

+0

@meiryo:@jcomeau_ictx是對的。這不是微不足道的。如果你沒有時間或者根本不想嘗試理解格式規範,試着搜索一些可以爲你執行工作的有用的庫。 – Heisenbug 2011-04-12 06:42:02

回答

4

這是一個1x1的XXD轉儲黑色窗口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

好的,42 4D是BM來告訴它這是一個合法的bmp文件。我不太確定3A等等。對不起,如果我沒有任何意義,目前有點壓力。 – meiryo 2011-04-12 07:04:26

+0

丹,你打敗了我,所以+1,但我沒有看到你的答案,直到我已經想出了轉換命令並拋棄了我的bmp文件。我能說什麼,除了偉大的思想家都這麼想:^) – 2011-04-12 07:06:15

+0

@jcomeau好吧,我已經重寫了這個問題,以便更清楚地表明我的目標。 – meiryo 2011-04-12 07:17:48

0

擴大在什麼@丹D.說,你可以使用ImageMagick的「轉換」命令在Linux(或可能的Windows也)將原始數據轉換爲圖像。我與巴紐測試,你必須測試在Windows上自己的輸出:

 
[email protected]:~$ echo -en "\0000" | convert -size 1x1 -depth 8 gray:- /tmp/1black.bmp 
[email protected]:~$ 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     .......... 
+0

我現在在Linux上嘗試這個...謝謝 – meiryo 2011-04-12 07:05:26

0

要打印出來,你需要創建一個數組 例如unsigned char bmp [] = { 並用上面的十六進制填充這部分。但是因爲它是十六進制的,所以你需要在每對數字的前面加上0x。 例如 0x42,0x4d 等等 這可以包含在{}括號中。 例如 unsigned char bmp[] ={ 0x42, 0x4d, 0x.... } 然後只需使用寫入功能通過套接字發送。 write(socket,bmp,sizeof(bmp));