В то время как другие ответы хорошо описывали все различия между 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 гораздо более опасно, чем именованные операторы преобразования, потому что нотация сложнее обнаружить в большой программе, а тип конверсии, предназначенной программисту, не является явным .
blockquote>
import jpeg
jpeg.setExif(jpeg.getExif('foo.jpg'), 'foo-resized.jpg')
Почему не использование ImageMagick?
Это - вполне стандартный инструмент (например, это - стандартный инструмент, используемый Галереей 2); я никогда не использовал его, однако это имеет интерфейс Python также (или, можно также просто породить команду), и больше всего, должен поддержать информацию EXIF между всем преобразованием.
Можно использовать pyexiv2 для изменения файла после сохранения его.
PIL обрабатывает данные EXIF, не так ли? Посмотрите в PIL.ExifTags.