gpt4 book ai didi

Python Pillow 用 8 位打开 1 位深度文件

转载 作者:行者123 更新时间:2023-12-05 06:22:15 26 4
gpt4 key购买 nike

我有大约 7GB 的单位深度图像(黑白 BMP 文件),总共大约 59 十亿像素,我需要将它们粘贴到一个方形图像中。我的系统有 64GB RAM,所以我认为一次加载所有图像应该不是问题,然后创建一个新的输出图像(应该具有相同的大小/资源加载),并将子图像粘贴到其中。最后将其保存到磁盘。

好吧,看 top,我看到在我的图像加载后,程序消耗了 56GB RAM(即 7GB * 8)。在粘贴操作期间,程序被杀死。

我能否以某种方式更改 Pillow open 调用以在 native 深度打开?是否有人可能会推荐另一个图像处理库(如果这是唯一明显的途径,其他语言也是可以接受的……)。

代码如下:

import os
import math
import numpy as np
from rectpack import newPacker, PackingMode
import rectpack.packer
from PIL import Image, PILLOW_VERSION
dirname = 'output_12_15'
files = sorted(os.listdir(dirname))
images = []
num_pixels = 0
for i, file in enumerate(files[1:]):
filepath = os.path.join(dirname, file)
img = Image.open(filepath)
images.append(img.copy())
img.close()
width, height = images[-1].size
num_pixels += width*height
if not i%1000:
print(i)
print('number of total pixels: {}'.format(num_pixels))
edge_len = math.ceil(num_pixels**(1/2))
theorhetical_num_images_wide = math.ceil(edge_len/1366.)
target_width = (theorhetical_num_images_wide+1)*1366
target_height = target_width

packer = newPacker(mode=PackingMode.Offline, sort_algo=rectpack.packer.SORT_NONE, rotation=False)
# Add the rectangles to packing queue
for img in images:
packer.add_rect(*img.size)
packer.add_bin(target_width, target_height)
print('starting to pack')
packer.pack()
print('finished packing, starting to paste image together')

if len(packer[0])!=len(images):
print('packer failed, bin was too small!')
import pdb;pdb.set_trace()
else:
else:
max_y = 0
max_x = 0
blank = Image.new("1", (target_width,target_height))
for i, rect in enumerate(packer[0]):
x = rect.x
y = rect.y
w = rect.width
h = rect.height
if y+h>max_y:
max_y = y+h
if x+w>max_x:
max_x = x+w
blank.paste(images[i], (x,y))
print('max_x {} max_y {} target_h {}'.format(max_x, max_y, target_height))
blank = blank.convert('1', dither=Image.NONE)
blank.save("59MP.bmp", "BMP")

更新 1:我将代码移至另一个具有 256GB RAM 的系统,并在进一步处理(进入最后一个 FOR 循环)后发现了一个错误。但随后它又因回溯而崩溃:

0
1000
2000
3000
4000
5000
6000
number of total pixels: 59926682272
starting to pack
finished packing, starting to paste image together
max_x 247246 max_y 247243 target_h 247246
Traceback (most recent call last):
File "stitch_bmps.py", line 75, in <module>
blank.save("59MP.bmp", "BMP")
File "/home/nmz787/.local/lib/python3.7/site-packages/PIL/Image.py", line 2084, in save
save_handler(self, fp, filename)
File "/home/nmz787/.local/lib/python3.7/site-packages/PIL/BmpImagePlugin.py", line 332, in _save
+ o32(offset) # reserved
File "/home/nmz787/.local/lib/python3.7/site-packages/PIL/_binary.py", line 91, in o32le
return pack("<I", i)
struct.error: 'I' format requires 0 <= number <= 4294967295

更新 2:在错误之前的 BmpImagePlugin 文件中添加了一个 pdb.set_trace() 调用:

(Pdb) image
7641879368
(Pdb) offset+image
7641879430
(Pdb) (offset+image)<4294967295
False
(Pdb) (image)<4294967295
False

Sooo,我猜这是说 BMP 格式,或者 PIL 对 BMP 的实现,不支持这么大的图像?

最佳答案

根据 https://pillow.readthedocs.io/en/5.1.x/handbook/concepts.html ,只有图像模式

1 (1-bit pixels, black and white, stored with one pixel per byte)

但不是每字节 8 个像素的。

所以 Pillow 似乎是不可能的。

关于Python Pillow 用 8 位打开 1 位深度文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59353721/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com