我认为位图文件的格式,甚至是与设备无关的位图,因为它在windows上与其他操作系统不兼容。
有没有一种方法可以在操作系统之间传输/共享原始位图图像,而无需对PNG、JPEG等格式进行编码和解码?
我将使用插座。
edit:为了增加清晰度,我需要处理到达Windows机器的图像,并将其进一步传输到另一台机器,这台机器主要是Linux机器,在那里它将被进一步处理。图像以位图形式以高频率到达。处理和传输必须尽可能快,几乎实时,因此需要使用原始位图而不是压缩图像。对于传输,我会使用套接字和tcp/ip。图像必须至少为1600万色。图像必须绘制在另一台机器上,这是疑问的关键。
Windows位图(AKA.BMP)格式是一种众所周知的格式,您可以在网上找到它的描述。许多图像查看器在Windows以外的操作系统上支持它。
此外,网络、互联网和插座根本不在乎你在传输什么数据或以什么格式传输。
您可以使用PGM/PPM文件(PGM用于单通道,PPM用于3通道)。我个人使用过这些格式,因为它们非常容易读/写。您可以在这里(PGM)和这里(PPM)找到格式规范。
纯ASCII文件头如下所示:
<MAGIC>n
<WIDTH> <HEIGHT> <MAX_VAL>n
其中<MAGIC>
表示PGM的"P5",表示PPM的"P6"。<WIDTH>
和<HEIGHT>
是您的宽度和高度,作为ASCII编码数字。对于每通道8位的图像,CCD_ 4可能是255。我已经明确指出了换行符,但实际上您可以使用任何您喜欢的空格来分隔标题中的四个字段。然而,在<MAX_VAL>
之后,后面必须有一个SINGLE空白字符(尽管它可以是任何空白字符)。
在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, "P6n%d %d 255n", 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, "P6n%d %d 255n", &width, &height);
if(fieldsRead != 2) ERROR;
然后为主体分配存储并读取:
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;
}
当然,读/写调用可能需要更改才能使用套接字,但其意图应该很清楚。