有没有办法在Python中读取不涉及使用PIL的bmp文件? PIL不适用于我拥有的版本3。我尝试使用graphics.py,Image(anchorPoint,filename)中的Image对象,但这似乎只适用于gif文件。
答案 0 :(得分:13)
在Python中,它可以简单地理解为:
import os
from scipy import misc
path = 'your_file_path'
image= misc.imread(os.path.join(path,'image.bmp'), flatten= 0)
## flatten=0 if image is required as it is
## flatten=1 to flatten the color layers into a single gray-scale layer
答案 1 :(得分:2)
我意识到这是一个老问题,但我在自己解决这个问题时发现了这个问题,并且我认为这可能在将来帮助其他人。
将BMP文件作为二进制数据读取非常容易。取决于您当然需要支持的广泛支持和角落数量。
下面是一个简单的解析器,仅适用于1920x1080 24位BMP(就像从MS Paint保存的那样)。虽然应该很容易扩展。对于红色图像,它将像素值作为python列表(如(255, 0, 0, 255, 0, 0, ...)
)吐出为例。
如果您需要更强大的支持,那么有关如何正确阅读此问题答案中标题的信息:How to read bmp file header in python?。使用该信息,您应该能够使用您需要的任何功能扩展下面的简单解析器。
如果您需要,还可以在维基百科https://en.wikipedia.org/wiki/BMP_file_format上了解有关BMP文件格式的更多信息。
def read_rows(path):
image_file = open(path, "rb")
# Blindly skip the BMP header.
image_file.seek(54)
# We need to read pixels in as rows to later swap the order
# since BMP stores pixels starting at the bottom left.
rows = []
row = []
pixel_index = 0
while True:
if pixel_index == 1920:
pixel_index = 0
rows.insert(0, row)
if len(row) != 1920 * 3:
raise Exception("Row length is not 1920*3 but " + str(len(row)) + " / 3.0 = " + str(len(row) / 3.0))
row = []
pixel_index += 1
r_string = image_file.read(1)
g_string = image_file.read(1)
b_string = image_file.read(1)
if len(r_string) == 0:
# This is expected to happen when we've read everything.
if len(rows) != 1080:
print "Warning!!! Read to the end of the file at the correct sub-pixel (red) but we've not read 1080 rows!"
break
if len(g_string) == 0:
print "Warning!!! Got 0 length string for green. Breaking."
break
if len(b_string) == 0:
print "Warning!!! Got 0 length string for blue. Breaking."
break
r = ord(r_string)
g = ord(g_string)
b = ord(b_string)
row.append(b)
row.append(g)
row.append(r)
image_file.close()
return rows
def repack_sub_pixels(rows):
print "Repacking pixels..."
sub_pixels = []
for row in rows:
for sub_pixel in row:
sub_pixels.append(sub_pixel)
diff = len(sub_pixels) - 1920 * 1080 * 3
print "Packed", len(sub_pixels), "sub-pixels."
if diff != 0:
print "Error! Number of sub-pixels packed does not match 1920*1080: (" + str(len(sub_pixels)) + " - 1920 * 1080 * 3 = " + str(diff) +")."
return sub_pixels
rows = read_rows("my image.bmp")
# This list is raw sub-pixel values. A red image is for example (255, 0, 0, 255, 0, 0, ...).
sub_pixels = repack_sub_pixels(rows)
答案 2 :(得分:2)
我必须在一个项目中工作,我需要使用python读取BMP文件,这很有趣,实际上最好的方法是先检查一下BMP文件格式(https://en.wikipedia.org/wiki/BMP_file_format),然后再读取它作为binairy文件,以提取数据。
您将需要使用struct python库执行提取
您可以使用本教程来了解它如何进行https://youtu.be/0Kwqdkhgbfw
答案 3 :(得分:1)
PIL到Python 3.x的公共端口称为“Pillow”。 另外我会建议pygame库用于简单的任务。它是一个图书馆,充满了创建游戏的功能 - 其中包括一些常见的图像格式。也适用于Python 3.x.
答案 4 :(得分:0)
这取决于您要实现的目标以及在哪个平台上?
无论如何使用C库来加载BMP可能会起作用,例如http://code.google.com/p/libbmp/或http://freeimage.sourceforge.net/,可以从python中轻松调用C库,例如使用ctypes或将其包装为python模块。
或者您可以编译此版本的PIL https://github.com/sloonz/pil-py3k
答案 5 :(得分:0)
如果你在Windows中这样做,这个网站应该允许你使用大多数版本的Python获得PIL(以及许多其他流行的软件包):Unofficial Windows Binaries for Python Extension Packages
答案 6 :(得分:0)
为此使用枕头。安装好后直接导入
from PIL import Image
然后就可以加载BMP文件了
img = Image.open('path_to_file\file.bmp')
如果您需要图像为 numpy 数组,请使用 np.array
img = np.array(Image.open('path_to_file\file.bmp'))
numpy 数组只会是一维的。如果您的图像是 RGB,请使用 reshape()
将其调整为正确的形状。例如:
np.array(Image.open('path_to_file\file.bmp')).reshape(512,512,3)
答案 7 :(得分:0)
使用优秀的 matplotlib 库
import matplotlib.pyplot as plt
im = plt.imread('image.bmp')