【问题标题】:how to get extension name of an uploaded image file from Django request.data如何从 Django request.data 获取上传的图像文件的扩展名
【发布时间】:2021-07-12 12:54:06
【问题描述】:

关于改写问题的更新:

我正在使用 Django 并且已经实现了一个 REST API 图像文件发布。

我这样获取图像对象:

  image_obj = request.data['image']

如何获得扩展名?例如,如果文件是image.jpg,我想得到“jpg”作为扩展名。


以下是我最初的问题(您可以忽略,因为目标在上面):

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

例如,这里我有一个关于图像文件的 http 帖子,它使用 imdecode 创建一个 OpenCVv 对象,并使用 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

【问题讨论】:

  • .png.jpg等是图像压缩格式,一旦图像被解码,OpenCV矩阵只存储RGB数据和图像矩阵的维度。所以你可能需要在解码前将图像格式缓存到另一个变量中。
  • imdecode 不需要知道压缩类型,它会查看数据头来决定必须使用哪种压缩技术。如果您想使用相同的编解码器重新编码图像,您可能必须自己评估图像标头(或者可能是 http 标头??)。

标签: python django image opencv


【解决方案1】:

这种字符串对象的方法-split-会帮助你:

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

【讨论】:

    【解决方案2】:

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

    @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)
    

    【讨论】:

    • 嗨,tq,它有这个错误:AttributeError:'InMemoryUploadedFile'对象没有属性'rfind'
    • 我什至试过这个,但它有同样的问题 - AttributeError: 'InMemoryUploadedFile' 对象没有属性 'split' stackoverflow.com/questions/15976732/…。 extension = u_file.split(".").lower()[-1]
    • 您应该在请求中发送文件名。然后你可以使用 request.data['filename'] 访问它并解析它。
    • 我如何传递文件名,它实际上是上传文件图像二进制文件?我为此更新了其余的 api 参数。
    • 在表单中添加一个隐藏字段,该字段将在您上传文件时填充,与其他表单数据一起传递。
    【解决方案3】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-02
      • 1970-01-01
      • 2013-06-02
      • 1970-01-01
      • 2012-08-12
      • 1970-01-01
      相关资源
      最近更新 更多