我只是“移动”图像,其元数据发生了变化...

时间:2018-11-15 06:35:52

标签: python-3.x image size python-imaging-library jpeg

我只是复制了映像并将其保存到当前目录中的另一个临时文件夹中,没有进行任何修改,但是映像占用的“ 磁盘空间”比“ 字节大小”更多”。

然后!这样做时,我丢失了图像的大部分元数据,例如位置数据,设备型号,F号等,仅保留了Color spaceAlpha channelDimensions

这是我要做的代码:

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)如何调整代码,以保留所有图像的元数据?

it should be 1.3 MB on disk, but it's 2.2 MB on disk...

1 个答案:

答案 0 :(得分:1)

两件事...

您实际上不是“仅复制” 您的文件。您正在图像处理器中打开它,将其扩展为可处理的像素矩阵,然后将图像重新保存到磁盘-减去图像处理器不感兴趣的任何内容:-)

如果要复制包括EXIF数据的完整文件,请像这样使用shutil

#!/usr/local/bin/python3

from shutil import copyfile
copyfile('source.jpg', 'destination.jpg')

签入 Finder

enter image description here


第二,所有“磁盘上” 文件系统都有一个最小分配单位,这意味着,如果您的文件增长了,它将以整个单位增长,即使您只需要再增加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!