我只是复制了映像并将其保存到当前目录中的另一个临时文件夹中,没有进行任何修改,但是映像占用的“ 磁盘空间”比“ 字节大小”更多”。
然后!这样做时,我丢失了图像的大部分元数据,例如位置数据,设备型号,F号等,仅保留了Color space
,Alpha channel
和Dimensions
。
这是我要做的代码:
from PIL import Image
import os
image_path = "/Users/moomoochen/Desktop/XXXXX.jpg"
img = Image.open(image_path)
pathname, filename = os.path.split(image_path)
new_pathname = (pathname + "/temp")
if not os.path.exists(new_pathname):
os.makedirs(new_pathname)
img.save(os.path.join(new_pathname, filename))
# If I want to adjust the quality, I do this:
img.save(os.path.join(new_pathname, filename), quality=80)
所以我的问题是:
1)为什么字节大小与磁盘空间不同?
2)如何调整代码,以保留所有图像的元数据?
答案 0 :(得分:1)
两件事...
您实际上不是“仅复制” 您的文件。您正在图像处理器中打开它,将其扩展为可处理的像素矩阵,然后将图像重新保存到磁盘-减去图像处理器不感兴趣的任何内容:-)
如果要复制包括EXIF数据的完整文件,请像这样使用shutil
:
#!/usr/local/bin/python3
from shutil import copyfile
copyfile('source.jpg', 'destination.jpg')
签入 Finder :
第二,所有“磁盘上” 文件系统都有一个最小分配单位,这意味着,如果您的文件增长了,它将以整个单位增长,即使您只需要再增加1个字节的空间。大多数磁盘使用4,096字节的分配单元,因此33字节的文件将占用4,096字节的空间。我必须说您的磁盘的松弛度要高于4k,所以也许您正在一个胖RAID上运行,而RAID可以大块工作以提高性能?
例如,您可以在终端中执行此操作:
# Write a file with 1 logical byte
echo -n "1" > file
# Look at file on disk
ls -ls file
8 -rw-r--r-- 1 mark staff 1 15 Nov 08:10 file
仔细查看,1
之后的staff
表示逻辑大小为1字节,这就是程序读取整个文件时得到的结果。但是左边的第一个8
是磁盘上的块数。每个块都是512字节,因此这个1字节的文件需要8个512字节的块,即磁盘上的4kB!