- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我正在尝试使用 Python 来调整图片大小。用我的相机,文件都是横向写的。
exif 信息处理一个标签以要求图像查看器以某种方式旋转。由于大多数浏览器不理解此信息,我想使用此 EXIF 信息旋转图像并保留所有其他 EXIF 信息。
你知道我如何使用 Python 做到这一点吗?
阅读 EXIF.py 源代码,我发现了类似的东西:
0x0112: ('Orientation',
{1: 'Horizontal (normal)',
2: 'Mirrored horizontal',
3: 'Rotated 180',
4: 'Mirrored vertical',
5: 'Mirrored horizontal then rotated 90 CCW',
6: 'Rotated 90 CW',
7: 'Mirrored horizontal then rotated 90 CW',
8: 'Rotated 90 CCW'})
我如何使用这些信息和 PIL 来应用它?
最佳答案
我终于用了pyexiv2 ,但在 GNU 以外的其他平台上安装有点棘手。
#!/usr/bin/python
# -*- coding: utf-8 -*-
# Copyright (C) 2008-2009 Rémy HUBSCHER <natim@users.sf.net> - http://www.trunat.fr/portfolio/python.html
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
# Using :
# - Python Imaging Library PIL http://www.pythonware.com/products/pil/index.htm
# - pyexiv2 http://tilloy.net/dev/pyexiv2/
###
# What is doing this script ?
#
# 1. Take a directory of picture from a Reflex Camera (Nikon D90 for example)
# 2. Use the EXIF Orientation information to turn the image
# 3. Remove the thumbnail from the EXIF Information
# 4. Create 2 image one maxi map in 600x600, one mini map in 200x200
# 5. Add a comment with the name of the Author and his Website
# 6. Copy the EXIF information to the maxi and mini image
# 7. Name the image files with a meanful name (Date of picture)
import os, sys
try:
import Image
except:
print "To use this program, you need to install Python Imaging Library - http://www.pythonware.com/products/pil/"
sys.exit(1)
try:
import pyexiv2
except:
print "To use this program, you need to install pyexiv2 - http://tilloy.net/dev/pyexiv2/"
sys.exit(1)
############# Configuration ##############
size_mini = 200, 200
size_maxi = 1024, 1024
# Information about the Photograph should be in ASCII
COPYRIGHT="Remy Hubscher - http://www.trunat.fr/"
ARTIST="Remy Hubscher"
##########################################
def listJPEG(directory):
"Retourn a list of the JPEG files in the directory"
fileList = [os.path.normcase(f) for f in os.listdir(directory)]
fileList = [f for f in fileList if os.path.splitext(f)[1] in ('.jpg', '.JPG')]
fileList.sort()
return fileList
def _mkdir(newdir):
"""
works the way a good mkdir should :)
- already exists, silently complete
- regular file in the way, raise an exception
- parent directory(ies) does not exist, make them as well
"""
if os.path.isdir(newdir):
pass
elif os.path.isfile(newdir):
raise OSError("a file with the same name as the desired " \
"dir, '%s', already exists." % newdir)
else:
head, tail = os.path.split(newdir)
if head and not os.path.isdir(head):
_mkdir(head)
if tail:
os.mkdir(newdir)
if len(sys.argv) < 3:
print "USAGE : python %s indir outdir [comment]" % sys.argv[0]
exit
indir = sys.argv[1]
outdir = sys.argv[2]
if len(sys.argv) == 4:
comment = sys.argv[1]
else:
comment = COPYRIGHT
agrandie = os.path.join(outdir, 'agrandie')
miniature = os.path.join(outdir, 'miniature')
print agrandie, miniature
_mkdir(agrandie)
_mkdir(miniature)
for infile in listJPEG(indir):
mini = os.path.join(miniature, infile)
grand = os.path.join(agrandie, infile)
file_path = os.path.join(indir, infile)
image = pyexiv2.Image(file_path)
image.readMetadata()
# We clean the file and add some information
image.deleteThumbnail()
image['Exif.Image.Artist'] = ARTIST
image['Exif.Image.Copyright'] = COPYRIGHT
image.setComment(comment)
# I prefer not to modify the input file
# image.writeMetadata()
# We look for a meanful name
if 'Exif.Image.DateTime' in image.exifKeys():
filename = image['Exif.Image.DateTime'].strftime('%Y-%m-%d_%H-%M-%S.jpg')
mini = os.path.join(miniature, filename)
grand = os.path.join(agrandie, filename)
else:
# If no exif information, leave the old name
mini = os.path.join(miniature, infile)
grand = os.path.join(agrandie, infile)
# We create the thumbnail
#try:
im = Image.open(file_path)
im.thumbnail(size_maxi, Image.ANTIALIAS)
# We rotate regarding to the EXIF orientation information
if 'Exif.Image.Orientation' in image.exifKeys():
orientation = image['Exif.Image.Orientation']
if orientation == 1:
# Nothing
mirror = im.copy()
elif orientation == 2:
# Vertical Mirror
mirror = im.transpose(Image.FLIP_LEFT_RIGHT)
elif orientation == 3:
# Rotation 180°
mirror = im.transpose(Image.ROTATE_180)
elif orientation == 4:
# Horizontal Mirror
mirror = im.transpose(Image.FLIP_TOP_BOTTOM)
elif orientation == 5:
# Horizontal Mirror + Rotation 90° CCW
mirror = im.transpose(Image.FLIP_TOP_BOTTOM).transpose(Image.ROTATE_90)
elif orientation == 6:
# Rotation 270°
mirror = im.transpose(Image.ROTATE_270)
elif orientation == 7:
# Horizontal Mirror + Rotation 270°
mirror = im.transpose(Image.FLIP_TOP_BOTTOM).transpose(Image.ROTATE_270)
elif orientation == 8:
# Rotation 90°
mirror = im.transpose(Image.ROTATE_90)
# No more Orientation information
image['Exif.Image.Orientation'] = 1
else:
# No EXIF information, the user has to do it
mirror = im.copy()
mirror.save(grand, "JPEG", quality=85)
img_grand = pyexiv2.Image(grand)
img_grand.readMetadata()
image.copyMetadataTo(img_grand)
img_grand.writeMetadata()
print grand
mirror.thumbnail(size_mini, Image.ANTIALIAS)
mirror.save(mini, "JPEG", quality=85)
img_mini = pyexiv2.Image(mini)
img_mini.readMetadata()
image.copyMetadataTo(img_mini)
img_mini.writeMetadata()
print mini
print
如果您发现有什么可以改进的(除了它仍然适用于 Python 2.5),请告诉我。
关于python - 如何使用 PIL 调整大小并将旋转 EXIF 信息应用于文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1606587/
我正在使用 exiv2操作 jpeg 文件中的元数据。我需要将更多与图像处理相关的信息写入元数据中。除了标准标签之外,是否可以创建自定义 Exif 标签? 最佳答案 来自 http://www.exi
是否可以检测是否有人修改了照片中的 EXIF 数据?有人如何检测到 EXIF 数据已被修改? 最佳答案 参见 Can digital cameras sign images to prove auth
如上图所示,我选择拍照exif信息为空。我选择了来自手机的图像选项,但 exif 信息不为空。 最佳答案 现在可以通过 ExifInterface 支持库从流中读取 EXIF 数据。 compile
我想使用iphone-exif library我的项目中的 EXIF 数据。但我不知道我是否犯了任何错误,它给出了像 这样的错误 架构 i386 的 undefined symbol : “_OBJC
场景:几个人带着数码相机一起去度假,然后抓拍。有些人记得将他们的相机时钟调整为本地时间,有些人将它们留在家乡时间,有些人将它们留在他们出生国家的本地时间,还有一些人将他们的相机留在工厂时间。 问题:照
如何加载图像并根据它的方向 exif 数据旋转它并使用UIImageOrientationUp exif 数据(或没有任何方向)保存它exif 数据)以便不处理 exif 方向数据的软件将正确显示图像
PHP 版本 5.2.9 我想知道是否有人在使用 EXIF 2.3 的 PHP 的 exif_read_data() 提取 GPS 或什至只是提取所有 EXIF 数据时遇到问题(并可能找到解决方案)。
我试图了解 jpeg 文件(十六进制)的 EXIF header 部分以及如何理解它,以便我可以提取数据,特别是 GPS 信息。无论好坏,我都在使用 VB.Net 2008(对不起,这是我现在可以掌握
我喜欢遵循此处描述的简码约定:https://laurakalbag.com/processing-responsive-images-with-hugo/并像这样在 config.toml 中设置
有谁知道 EXIF 键名的一个很好的解释?我正在写一个照片组织者,并希望尽可能多地从照片中获取信息。 但是,EXIF 键名并不是很有帮助。例如,据我所知(通过从 iPhoto 导出图像) 专辑或集合名
我正在研究照片查看器。在这种情况下,我编写了一个小类来读取和使用一些 EXIF 数据,例如图像方向。这门课很适合阅读。 但是,我会添加一个新选项来旋转照片。我想旋转和写入照片数据本身,而不仅仅是重写方
我是 PHP 新手,正在改编来自 http://www.techrepublic.com/article/create-a-dynamic-photo-gallery-with-php-in-thre
我正在使用我正在拍摄的照片中的 iPhone EXIF 数据。 目前我得到的 EXIF 数据是: { ApertureValue = "2.970854"; ColorSpace =
我有一堆带有地理标记的图片,我正在使用 pyexiv2 在 python 中访问它们。它工作得很好,只是我不明白“GPSImgDirection”值给出了什么。基本上,它是两个很大的数字,例如: 21
在Python中,如何找出图像文件中EXIF标签的位置?我假设它位于文件的开头,但我有一些专有的图像格式,并且希望确保情况始终如此。谢谢。 最佳答案 这不仅取决于 EXIF 本身,还取决于文件类型。
我正在尝试从 DNG 文件(不是缩略图)获取 jpg 预览。据我所知,预览只是一个 exif 预览,并不特定于 DNG。然而,尽管我在谷歌上搜索了很多次,但我找不到任何关于专门从 c# 文件的 exi
我正在使用这个库 http://blog.nihilogic.dk/2008/05/reading-exif-data-with-javascript.html .我这样调用库:EXIF.pretty
我需要访问已加载到页面上的图像中的 EXIF 数据。说,从浏览器扩展。 AFAIU,有一些 javascript 方法可以完成任务: 使用JavaScript-Load-Image ; 使用Nihol
我有一个 iOS 应用程序,用户可以在其中上传使用 UIImagePickerController 拍摄的照片。 当我查看 jpg exif 数据时,我注意到大量照片的“相机型号名称”中填写了“iPo
我想在特定相册中保存一些带有图像的字符串。所以我使用了[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{添加 Assets 。 但是当我从相册
我是一名优秀的程序员,十分优秀!