0

我认为位图文件的格式,甚至是与设备无关的位图,因为它在 Windows 上与其他操作系统不兼容。

有没有一种方法可以跨操作系统传输/共享原始位图图像,而无需对 PNG、JPEG 等格式进行编码和解码?

我将使用套接字。

编辑:为了增加一些清晰度,我需要处理到达我的 Windows 机器的图像并将其进一步传输到另一台机器,这主要是一个 Linux 机器,它将被进一步处理。图像以位图的形式以高频率到达。处理和传输必须尽可能快地进行,几乎是实时的,因此需要使用原始位图而不是压缩图像。对于传输,我将使用套接字和 tcp/ip。图像必须至少为 1600 万色。并且图像必须在另一台机器上绘制,这是疑问的症结所在。

4

2 回答 2

1

Windows 位图 (AKA .BMP) 格式是一种众所周知的格式,您可以在网上找到它的说明。许多图像查看器在 Windows 以外的操作系统上都支持它。

此外,网络、互联网和套接字丝毫不关心您传输的数据或格式。

于 2012-07-18T08:08:41.063 回答
1

您可以使用 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;
}

当然,可能必须更改读/写调用以使用您的套接字,但意图应该是明确的。

于 2012-07-18T08:23:44.593 回答