如何从Django request.data获取上传的图像文件的扩展名

时间:2018-04-10 08:49:56

标签: python django image opencv

更新后的问题:

我正在使用Django并且已经实现了其他API图像文件。

我会得到像这样的图像对象:

  image_obj = request.data['image']

如何获取扩展名?例如,如果文件是image.jpg,我想得到" jpg"扩展名。

以下是我原来的问题(你可以忽略,因为目标在上面):

有没有办法确定图像的类型,如jpg,jpeg,png等,以便我可以将其解码回相同的格式?

例如,我在图像文件上有一个http帖子,它使用imdecode创建opencv对象,并使用imencode重新创建对象(我不确定这是否正确)。

  image_obj = request.data['image']

  im_cv = cv2.imdecode(np.fromstring(image_obj.read(), np.uint8), cv2.IMREAD_UNCHANGED)

  ... do something like crop, detection, etc

  ret, buf_im_cv = cv2.imencode( '.png', im_cv ) <-- in this case I have to specify png, what if its jpg, etc

3 个答案:

答案 0 :(得分:1)

这种字符串对象方法- 分割 -将帮助您:

ext = image_obj.name.split('.')[-1]    

答案 1 :(得分:0)

将图片名称作为表单中的隐藏字段传递,并使用它来解析文件扩展名。

@api_view(['POST'])
def employee_test(request):
    """
    description: employee_management_test
    parameters:   
      - name: image
        type: file
        required: true
        location: form                               
    """   
    image_obj = request.data['image']
    imagename = request.data['imagename']
    # Also handle the case of file not having extension
    extension = imagename[imagename.rfind("."):] 
    ...
    # Do you stuff here
    ret, buf_im_cv = cv2.imencode(extension, im_cv)

答案 2 :(得分:0)

值得注意的是,文件扩展名可能无法准确表示图像文件的真实编码格式,例如任何人都可以将文件命名为 xxx.jpg,它实际上是一个 TIFF 图像。

更可靠的方法是使用现有的包,例如:

  • imghdr ,一个内置的python包
  • magic 是一个在操作系统级别依赖于 libmagic 的第三方软件包,许多流行的操作系统发行版应该已经包含这个库。

上述两个包的工作方式相似,都是通过提取文件的开头部分来检查图像编码格式。根据我的经验,magicmagic 相对更可靠,但两者都比从文件名中提取扩展名要好。