Я просто "перемещаю" изображение, и его метаданные изменяются ... - PullRequest
0 голосов
/ 15 ноября 2018

Я просто скопировал свое изображение и сохранил его в другую временную папку в текущем каталоге, ничего не изменилось, но изображение занимает больше " дискового пространства ", чем его " размер в байтах * ».

А!Когда я это сделал, я потерял большую часть метаданных моего изображения, таких как данные о местоположении, модель устройства, номер 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) Как я могу настроить свой код так, чтобы он сохранял все метаданные изображения?

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

1 Ответ

0 голосов
/ 15 ноября 2018

Две вещи ...

Вы на самом деле не "просто копируете" ваш файл. Вы открываете его в процессоре изображений, расширяете его до обрабатываемой матрицы пикселей и затем сохраняете изображение на диск - минус все, что не интересовало ваш процессор изображений : -)

Если вы хотите скопировать весь файл, включая данные EXIF, используйте shutil, например:

#!/usr/local/bin/python3

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

Регистрация Поиск :

enter image description here


Во-вторых, все "на диске" файловые системы имеют минимальную единицу выделения, что означает, что если ваш файл увеличивается, он будет увеличиваться на целую единицу, даже если вам просто потребуется еще 1 байт пространства. Большинство дисков используют единицу выделения 4096 байт, поэтому 33-байтовый файл будет занимать 4096 байт. Должен сказать, что у вас уровень слабости выше 4 Кб, так что, может быть, вы используете толстый 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 байт, то есть 4 КБ на диске!

...