【问题标题】:I just "move" image, and its metadata changes...我只是“移动”图像,它的元数据会改变......
【发布时间】:2018-11-15 06:35:51
【问题描述】:

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

还有!当我这样做时,我丢失了大部分图像的元数据,例如位置数据、设备型号、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) 如何调整我的代码以保留所有图像的元数据?

【问题讨论】:

  • 嗨,我建议在data clusters in filesystems 上查看维基百科的文章
  • 感谢您的文章,我不确定这是否是问题所在,我应该提到它并没有发生在我的所有图像上,通常它只是大致相同的字节大小和磁盘符合预期的空间,但在某些情况下,比如这个,它只需要更多的磁盘空间。
  • 我的回答解决了你的问题吗?如果是这样,请考虑接受它作为您的答案 - 通过单击计票旁边的空心对勾/复选标记。如果没有,请说出什么不起作用,以便我或其他人可以进一步帮助您。谢谢。 meta.stackexchange.com/questions/5234/…

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


【解决方案1】:

两件事...

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

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

#!/usr/local/bin/python3

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

签入Finder:


其次,所有“on-disk”文件系统都有一个最小分配单元,这意味着如果你的文件增长,它会增长一个完整的单元,即使你只需要1个字节的空间.大多数磁盘使用 4,096 字节的分配单元,因此 33 字节的文件将占用 4,096 字节的空间。我必须说你的 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!

【讨论】:

  • 谢谢马克!非常详细且解释清楚。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-20
  • 2019-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-07
相关资源
最近更新 更多