Измените размеры изображения в Python, не теряя данные EXIF

В то время как другие ответы хорошо описывали все различия между C ++-кастами, я хотел бы добавить короткую заметку, почему вы не должны использовать C-style cast (Type) var и Type(var).

Для начинающих C ++ C -style casts выглядит как операция надмножества над листами C ++ (static_cast & lt;> (), dynamic_cast & lt;> (), const_cast & lt;> (), reinterpret_cast & lt;> ()), и кто-то может предпочесть их по сравнению с C ++-переходами. Фактически, C-стиль является надмножеством и короче для записи.

Основная проблема приведения в стиле C заключается в том, что они скрывают замыслы разработчика в отношении создания. Стили C-стиля могут выполнять практически все типы отливок из обычно безопасных отбрасываний, выполняемых static_cast & lt;> () и dynamic_cast & lt;> (), в потенциально опасные роли, такие как const_cast & lt;> (), где модификатор const может быть удален, поэтому константные переменные могут быть изменены и reinterpret_cast & lt;> (), которые могут даже переинтерпретировать целочисленные значения указателям.

Вот пример.

int a=rand(); // Random number.

int* pa1=reinterpret_cast<int*>(a); // OK. Here developer clearly expressed he wanted to do this potentially dangerous operation.

int* pa2=static_cast<int*>(a); // Compiler error.
int* pa3=dynamic_cast<int*>(a); // Compiler error.

int* pa4=(int*) a; // OK. C-style cast can do such cast. The question is if it was intentional or developer just did some typo.

*pa4=5; // Program crashes.

Основная причина, по которой C ++-роли были добавлены в язык должен был позволить разработчику прояснить его намерения - почему он собирается сделать это. Используя C-стиль, отличные от C ++, вы делаете свой код менее удобочитаемым и больше подвержены ошибкам, особенно для других разработчиков, которые не создали ваш код. Поэтому, чтобы сделать ваш код более читабельным и явным, вы всегда должны предпочитать, что C ++ выполняет броски C-style.

Вот короткая цитата из книги Bjarne Stroustrup (автора C ++). Язык программирования C ++ 4th edition - стр. 302.

Это смещение в стиле C гораздо более опасно, чем именованные операторы преобразования, потому что нотация сложнее обнаружить в большой программе, а тип конверсии, предназначенной программисту, не является явным .

25
задан Einar Egilsson 30 December 2008 в 16:42
поделиться

4 ответа

import jpeg
jpeg.setExif(jpeg.getExif('foo.jpg'), 'foo-resized.jpg') 

http://www.emilas.com/jpeg/

11
ответ дан jfs 15 October 2019 в 16:49
поделиться

Почему не использование ImageMagick?
Это - вполне стандартный инструмент (например, это - стандартный инструмент, используемый Галереей 2); я никогда не использовал его, однако это имеет интерфейс Python также (или, можно также просто породить команду), и больше всего, должен поддержать информацию EXIF между всем преобразованием.

4
ответ дан rob 15 October 2019 в 16:49
поделиться

Можно использовать pyexiv2 для изменения файла после сохранения его.

1
ответ дан iny 15 October 2019 в 16:49
поделиться

PIL обрабатывает данные EXIF, не так ли? Посмотрите в PIL.ExifTags.

0
ответ дан PEZ 15 October 2019 в 16:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: