There are two things needed to be done in order to massage the raw pixel data of a 24 bits per pixel BMP into a full image file with Pillow:
- Flip the image upside down as BMP saves the pixel rows from bottom up,
- and reorder the pixel components as BMP stores pixels in blue, green, red order but Pillow only supports the RGB order.
Suppose you have the 33456 bytes raw pixel data in a file called test.dat
:
#!/usr/bin/env python
from __future__ import absolute_import, division, print_function
from PIL import Image
def main():
with open('test.dat', 'rb') as data_file:
raw_data = data_file.read()
red, green, blue = Image.frombytes('RGB', (164, 68), raw_data).split()
image = Image.merge('RGB', (blue, green, red))
image = image.transpose(Image.FLIP_TOP_BOTTOM)
image.save('result.bmp')
if __name__ == '__main__':
main()
Here is a small program creating a sample test.dat
:
#!/usr/bin/env python3
import base64
import gzip
DATA = b'''\
H4sIAOkP7VwC/+3c+1MTRxwA8L/C6g/9yVHbOnYqte2MVsfWajvTmSqSqbVSR6vVWq3QDsy09VFf
gPXFqxSIEEFGBEU0AqIICmgK6GREtEJCCAFFXjoghHtfQhcSIblcQhIud5vc7nx/Svb2Lvdh9767
e8PoKCylV68dRUUeJUMxs7u5Ad0HORTVxrkZilmD3UZ0K2RijbhlZY24ZWUNAn/1At0TmViDoHEz
ui0ysUbcsrJG3LKyBoFujnyssyJno/sTWtbz3FnDwG21WmV1Xk551nRHW5SkObNfk3NAo9pXcXJ7
ZdJP/sWt1Cjlujc9WIM4s+mdqpTdoPLNxB21yt/a6kpF/r2VlVXih+TKLbcLz/+8xCl2f5y3LSw9
fEZGxCw/Q+FdOB/VcC4eWQeuXEvYyIUejwIb95oZgbV24c7ZNB9ZB6KUHVnPC/2ae2nu9wv8790K
P+tkR85D1sKWxzdyPEDbuaOmx+1vVKfHiGmt1WqNxva2NqOwAdoELcNgPSW0tNwkNiyaNUAJ0FlA
y5JbG+vLvLS2cedsnp8e/oaY1vV5caJZgz4YoLOAliW3rsmM9d56nHsZmDKLyX3hl+XIWpj0Oy7S
J2vxuVUBztDcWTeY2MRbVEq1nwGOBS1AZX0x5jNfrSe514rELYk1wJpzcGQ6AVqAyroodpUf1jbu
7Mg56Wtnhqo16JvTtAYtQGUNyPyztnNvmJ0RMRNZB4V154NbpvsVfkeHtlJfU9RaWxy4aKnKl8T6
aMV0rUELUFmjwmst1D7URDuSW0OysybtdQo75+oZslxpoveUkItPYgVaGqp+rSv9u/nyqeYridMN
dVJT/oHG3D8az+4RNu5nRsE8v8Yoa5WOSbhBhisxzhgeU0xCZX332PrauLWCxJ34iBu/flQeFVYe
9b6wIZq1Xt/qzSH3TExaDbXxLO75eb00EZs4BLQsubXmRKRQ1mPcCYpAcIv5dJj4xPGrll42p57a
WYgv+su39GzKswSvtY37evQHQdSvPZT9pcQnyZgfGfjCBPOPBcRpDUWzEGVEgluPRXzE9ehFIWD9
dTbuta95Qw6efJuqa2ecthsMTIhbC80t1c1J9ricsjoTP3KdrGhmhggL50CSsf5ZRjgO46FsLSi3
VDcHdFJHXDCe/64mihvprkGLu0P6hi07CwnHo9JqqdC3Ho/y3WHBa00xVjAy59ZTzT3slJVbeizr
z2AeMrSQt645Ej59bsiXejRtzMpUtyncu/HmpwMWOVgLwg2t8tVHtIdZ2IoUrHY8N3v4jO0flp77
7rFvA21t5w4ta1UdNdd92rZOhT3ptg/7JY9o8Ml7CdKP5I15e7XZMVpVbMBDGa05vgEMI75G9aGv
oFI+UUV6SM53FBC9Dl340LXJyqszsFDdUwiZ67SdHaOsIAn3oLy3hCBop+tUZGGudUZRgbt853Hp
2/Fdo4kEPuwot9rypLF+/eApK9WvIAY7iIF2kQPvb8Ff6LwMrO+J5NZrlDzWbx0ayW3gmTsb+lnX
ytvP4+CrzoGxr75Ml2YwN6m3mtRbRI72S5G6syv1eZ97GZJbP37uxPfh8ZHSxzR/Zt5Eu0Jn3rX/
STh+2NQldgfvKNslvrXp6lajL9wwDOOfjm+CfJGG1be7XeI+cI0nbWsw2etzVlqWJWKysPaRGwbr
B0+Z/7o99cTw0zzLKS/N9pw87x4t+WKaZNa+cEOeuZGMdWGCSyaWPKnZPWThfPvoOSsvaxt30TdT
csMM3drH8s2yccc6bx92+vZYJSnJpUpsPcb9g/HiFNzQQl9+yJOJZf3rlLZxXlVakSrZior01l5w
wwm9t4RnaeV+h1PmdkFLw7PnBYX1a269G24IoddkcjOxuQdHBjCnDY5+M/cxre1kkbWN21AYwcsN
G3RqDeW6peVabUGcU53D5aS0lw2RtXpLhxtuCPv15rzJp/CuC7hrhW35uLSzab51sy1QBeBuK1To
81bB/7xecmpsGFfV8SyTql1WzxgIXihlaZylMcgCZ0kzS70OEtL/UkvQ1tt6njU08NTmQHtYakMl
qAtnXWUfHPuYaP9a8AKe3Y7Qi09C9M4w0XmRMJ0jTPnwhlEVLNDlTxjO6E0yEP2V4vo0XJcEeQQF
dNcg9zFd0wrXYxpv/QdZC1WiL02upMVege51I9ygRNYClpsttO1lBhgnDqbzsFsblMGVh/cNW3qG
LBBeGNVbDbk1+UyN5nGCFAv5EnJrdtiAmAQbxg1ZEFsnIyAhuzYzAm+nxroQkMCr4iMdEELTAw8R
TUC4sS6ooJlXzQgloIV+0YDrUiUkxnQpYGqAILwv/wPSBv8IsIIAAA=='''
def main():
with open('test.dat', 'wb') as file:
file.write(gzip.decompress(base64.decodebytes(DATA)))
if __name__ == '__main__':
main()