我只是 "move" 图片,它的元数据发生了变化......

I just "move" image, and its metadata changes...

我简单地复制了我的图像并将其保存到当前目录中的另一个临时文件夹中,没有任何修改,但是图像占用了更多的空间"disk space “比它的“字节大小”。

还有!当我这样做时,我丢失了我图像的大部分元数据,例如位置数据、设备型号、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) 为什么字节大小与磁盘大小不同space?

2) 我如何调整我的代码以使其保留所有图像的元数据?

两件事...

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

如果要复制包含 EXIF 数据的完整文件,请使用 shutil,如下所示:

#!/usr/local/bin/python3

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

签入 Finder:


其次,所有 "on-disk" 文件系统都有一个最小分配单元,这意味着如果您的文件增长,它将增长一个完整的单元,即使您只需要space 的 1 个字节。大多数磁盘使用 4,096 字节的分配单元,因此一个 33 字节的文件将占用 4,096 字节的space。我必须说你的 slack 比 4k 高得多,所以也许你 运行 在一个大块的 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

仔细看,staff之后的1表示逻辑大小为1字节,这就是程序读取整个文件时得到的大小。但是左边第一个8是磁盘上的块数。每个块是 512 字节,所以这个 1 字节的文件占用 8 个 512 字节的块,即磁盘上的 4kB!