在Python中将字节文件转换为图像

2 投票
1 回答
6725 浏览
提问于 2025-04-18 10:31

我有一个字节文件,是另一个程序输出的。这个字节文件包含了一帧来自摄像头的数据,分辨率是640x480。我想把这个文件读入Python,并把它转换成一张图片。

我一直在使用PIL库,但当我尝试这样做的时候……

   def readimage(path):
      with open(path, "Ur") as f:
        return f.read()

   def main():
    bytes = readimage("color725.txt")
    image = Image.fromstring('RGB', (640,480), bytes)
    image.save("test.bmp")

我得到的图片根本不是我开始时的那张图片。(看起来像是乱七八糟的东西)

当我尝试这样做的时候……

def readimage(path):
    with open(path, "rb") as f:
        return bytearray(f.read())

def main():
    bytes = readimage("color725.txt")
    image = Image.open(io.BytesIO(bytes))
    image.save("test.bmp")

我收到一个错误:“IO错误:无法识别图像文件”。这个问题并不是因为文件不存在,因为是图像命令抛出了错误,而不是打开文件的时候。

这两次尝试基本上总结了我从文档中看到的内容。其他我看到的内容并不太适用。我是不是漏掉了什么简单的东西,或者有没有更好的方法?如果能帮我找到问题的答案,我将非常感激。

字节文件的前几行以十六进制表示:

1010 1100 1010 1100 1111 1000 1211 1000 1413 1000 1212 1100 1013 1100 0f11 1200 0f11 1200 0f10 1300 0f10 1200 0f10 1200 1013 1300 1011 1400 1014 1500 0f12 1600 0f15 1500 1115 1500 1315 1400 1211 1300 1110 1100 100e 0f00 0f0c 0e00 0f0d 0d00 0f0d 0c00 0e0c 0c00 0e0c 0b00 0d0c 0b00 0c0d 0d00 0e0f 0f00 1010 1100 0e0e 1300 0c0c 0f00 0d0b 0b00 0e0a 0900 0c0a 0800 0b0a 0900 0909 0b00 0808 0900 0707 0800

1 个回答

3

看起来这个图片应该是以原始的pivel值格式存储,可能是bgr32格式。但是PIL(一个处理图像的库)只知道如何加载RGB格式的图片。

如果真是这样的话,你可以尝试简单地处理一下字节,把你最开始的字符串转换成RGB格式。

如果字节的顺序确实是蓝色、绿色、红色和一个零,你可以尝试从你最开始的代码开始,

bytes = readimage("color725.txt")
RGBbytes = ''.join([ bytes[i+2:i+3] + bytes[i+1:i+2] + bytes[i:i+1]
                   for i in range(0, len(bytes) -1, 4)])
image = Image.fromstring('RGB', (640,480), RGBbytes)

重新排列字节,调整成正确的RGB顺序,并去掉第四个字节。

撰写回答