- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有大约 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/
我正在用 Django 开发一个图片 uploader 。图片上传并保存到磁盘后,我正在尝试调整已保存图像的大小,同时保持其纵横比。我正在使用 Pillow 进行图像处理/调整大小。当我尝试调整图像大
我安装了 Pillow 包: python -m pip install pillow 得到成功消息(成功安装枕头)。关闭并重新打开终端。 但是当我尝试: import pillow 我收到错误消息:
当我运行 python manage.py runserver ,一切开始都很好,但后来我得到一个 SystemCheckError说明 Pillow 未安装;但是,这台机器上肯定安装了 Pillow
这个问题可能已经被问过好几次了,但我无法解决这个错误。我的 M1 Mac 上安装了 pillow、imageio 和其他库。但是,当我在代码下方运行时,仍然出现错误。 注意:我使用 miniforge
我正在遵循这个 SageMaker 指南并使用 1.12 cpu docker 文件。 https://github.com/aws/sagemaker-tensorflow-serving-cont
前言 Pillow作为一个图片模块。可谓是真的简便强大,它的前身是PIL,后来将他取代,现在的pillow 可谓是一家独大,好了,让我们来看看他的具体用法。 今天我们介绍pi
我想对 png 图像进行二值化。如果可能的话,我想使用 Pillow。我见过两种使用方法: image_file = Image.open("convert_image.png") # open co
我正在尝试使用 Pillow 为一些乌尔都语文本生成图像。使用相同的代码生成普通英语就像一个魅力,但当我对乌尔都语文本做同样的事情时,事情就不会那么顺利了。 以下是使用英语完成的代码和结果: from
美好的一天。 在我的工作中,有时我必须使用脚本从数字或 ID 中获取一些信息。就像下面的例子: 我使用的脚本: $sh script.sh 9999999999999 abc 出现在屏幕上的信息
我正在使用 Pillow 3.1.1 图像库和 Python 3.5.1。 我正在尝试使用 Pillow 在图像上绘制字体。但结果看起来绝对丑陋且 Not Acceptable 。 第一个例子:看起来
我希望给定目录中的所有图片都具有相同的大小。这就是我所拥有的: import PIL import os import math from PIL import Image dirPath = r"C
我正在尝试在我的服务器上重新安装 Pillow,我得到了这个: ... Proceed (y/n)? y Successfully uninstalled Pillow-4.0.0 (myproj
为什么我可以使用 ImageGrab.grab(300,200,400,150) 而不是这个:ImageGrab.grab(bbox)? 代码和错误消息: def wl(wx,wy): loc
我正在尝试使用pillow (pil) 来降低图像的文件大小,但是降低图像质量并不会降低保存图像的大小。保存的图像“image2”和“image3”大小相同。 import PIL from Imag
我需要沿着一条线获取像素值,我使用的是 Python3 和 Pillow。在 opencv 中有这样的东西 LineIterator这将返回两点之间所有适当的像素,但我在 Pillow 的文档中没有找
我有一张图片,我想将它转置 30 度。是否可以使用类似的东西 spinPicture003 = Picture003.transpose(Image.Rotate_30) 最佳答案 要绕其中心逆时针
opencv > pil ? 1
Image 对象有一些常用的基本属性,这些属性能够帮助我们了解图片的基本信息,下面对这些属性做简单的讲解: 1) size:查看图像的尺寸 from PIL import Image im = Im
我运行了以下命令将项目依赖项安装到 virtualenv novacek 中: (novacek) $ pip install -r reqs.txt reqs.txt 看起来像这样: Django=
我可以使用以下代码在基本图像上绘制黑色 strip (或矩形): base_width, base_height = img.size background = Image.new('RGBA', (
我是一名优秀的程序员,十分优秀!