如何在Python / Django中获取图像的DPI值

时间:2015-01-31 05:47:37

标签: python django dpi

我试图在我的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)

但我面临以下异常

enter image description here

1 个答案:

答案 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或类似的不存在的内容。