我试图在我的django驱动的web应用程序中使用python来提取图像的Dpi值。我正在使用以下函数来实现我想要的输出,即图像的Dpi值,但我面临异常。
这是获取图像的DPI值的函数
def get_exif_data(fname):
"""Get embedded EXIF data from image file."""
ret = {}
try:
img = Image.open(fname)
if hasattr( img, '_getexif' ):
exifinfo = img._getexif()
if exifinfo != None:
for tag, value in exifinfo.items():
decoded = TAGS.get(tag, tag)
ret[decoded] = value
except IOError:
print 'IOERROR ' + fname
return ret
这是我使用上述函数获取图像的DPI值的视图。
def get_dpi(request,image_id):
image = get_object_or_404(Photo,pk = image_id)
img = Image.open(image.photo)
dpi_info = get_exif_data(img)
context = RequestContext(request)
ctx = {'dpi':dpi_info}
return render_to_response('photo/download_image.html',ctx,context)
但我面临以下异常
答案 0 :(得分:1)
首先,我要问你为什么要DPI解决方案。除非您输出到物理媒体,否则它只是一个标记,并不具有任何意义。 1000x1000像素的图像在100dpi时可以是10x10,在10dpi时可以是100x100,但它仍然是完全相同的图像。完全相同的像素。很难想象img.size
没有为您提供所需的一切的场景。
话虽如此,如果您想从XResolution
获取PIL.ExifTags
来解析exif标记:
import Image
from PIL.ExifTags import TAGS
img = Image.open("path/to/.jpg")
info = img._getexif()
exifObj = {}
if info != None:
for tag, value in info.items():
decoded = TAGS.get(tag, tag)
exifObj[decoded] = value
exifObj
现在要么为空,要么等于:
{'YResolution': (720000, 10000), 'BitsPerSample': (8, 8, 8), 'ImageLength': 713, 'Orientation': 1, 'Copyright': 'Mark Meyer Photography', 'ExifImageWidth': 950, 'ExifImageHeight': 713, 'ColorSpace': 1, 'ResolutionUnit': 2, 'DateTime': '2015:01:30 21:37:51', 'XResolution': (720000, 10000), 'ExifOffset': 296, 'PhotometricInterpretation': 2, 'ExifVersion': '0221', 'Artist': 'MarkM', 'ImageWidth': 950, 'SamplesPerPixel': 3, 'Software': 'Adobe Photoshop CC 2014 (Macintosh)'}
DPI是:
exifObj['XResolution'][0]/exifObj['XResolution'][1]
在这种情况下,72DPI。
在您的示例中,您不清楚如何尝试访问上下文的DPI值。您收到属性错误,因此您可能在模板中尝试访问ctx.dpi或类似的不存在的内容。