您可以使用 PGM/PPM 文件(PGM 用于单通道,PPM 用于 3 通道)。我个人使用过这些格式,因为它们非常容易读/写。您可以在此处 (PGM)和此处 (PPM)找到格式规范。
文件头纯 ASCII 如下:
<MAGIC>\n
<WIDTH> <HEIGHT> <MAX_VAL>\n
其中<MAGIC>
PGM 为“P5”,PPM 为“P6”。<WIDTH>
并且<HEIGHT>
是您的宽度和高度,作为 ASCII 编码的数字。<MAX_VAL>
对于每通道 8 位的图像,可能是 255。我已明确指出换行符,但您实际上可以使用任何您喜欢的空格来分隔标题中的四个字段。然而,在 之后必须<MAX_VAL>
紧跟一个空白字符(尽管它可以是任何空白字符)。
在 Linux 上编写彩色位图的代码草图:
unsigned char image[height][width][3];
// ... fill image ...
int fd = // open socket
// prepare and send header
char header[100] = {0};
int headerLen = snprintf(header, 100, "P6\n%d %d 255\n", width, height);
ssize_t written = write(fd, header, headerLen);
if(written != headerLen) ERROR;
// send body
written = write(fd, image, sizeof(image));
if(written != sizeof(image)) ERROR;
对于阅读,您显然只需要阅读幻数、宽度和高度。
int fieldsRead = fscanf(fd, "P6\n%d %d 255\n", &width, &height);
if(fieldsRead != 2) ERROR;
然后为 body 分配存储并读取它:
unsigned char data = new unsigned char[width * height * 3]; // remember to delete later
ssize_t bytesRead = read(fd, data, width*height*3);
if(width*height*3 != bytesRead) {
delete [] data;
ERROR;
}
当然,可能必须更改读/写调用以使用您的套接字,但意图应该是明确的。