【问题标题】:Programmatically check for a motion jpeg image on Android以编程方式检查 Android 上的运动 jpeg 图像
【发布时间】:2019-10-01 09:51:56
【问题描述】:

我有一种在 Android 上缩小大图像的方法,但是当用户从设备中选择动态 JPEG 或者他们使用启用了动态的相机时,它就会被阻塞。

我已经使用 exiftool 查看了文件中运动图像的 exif 数据,并且我看到了带有值的属性:

MicroVideo
MicroVideoVersion
MicroVideoVersionOffset

但我没有在使用 ExifInterface 的 Android 中的 EXIF 数据中看到这些。我偷看了所有的 mAttributes,但它们都不存在。

有没有一种简单的方法可以识别这些图像并可能从文件的开头提取 jpeg。

【问题讨论】:

    标签: android jpeg


    【解决方案1】:

    事实证明,关于 jpeg 图像,我学到的东西比我想知道的要多得多。我正在寻找的运动值不在 exif 部分中,它们是存储在另一个部分中的 XMP 元属性。

    要以编程方式查看此部分,有一些库可以做到这一点,我使用了 Adob​​e XMP Core 库。它是少数允许编写标题的之一。

    要从启用运动的文件中仅提取 jpg 图像,类似于 Google 照片中的“提取”菜单项,可以使用以下代码完成,利用找到的 XMPUtil 类 here。代码所做的只是读取 XMP 标头并获取偏移量。然后它只将 jpeg 部分复制到一个新文件中,然后删除 XMP 值。

            val xmp = XmpUtil()
            val meta = xmp.extractOrCreateXMPMeta(photoFile.absolutePath)
    
            val haveVideoValue: XMPProperty? = meta.getProperty("http://ns.google.com/photos/1.0/camera/", "MicroVideo")
    
            val haveVideo = haveVideoValue?.value == "1"
    
            if (haveVideo) {
    
                val offsetValue = meta.getProperty("http://ns.google.com/photos/1.0/camera/", "MicroVideoOffset")
    
                meta.deleteProperty("http://ns.google.com/photos/1.0/camera/", "MicroVideo")
                meta.deleteProperty("http://ns.google.com/photos/1.0/camera/", "MicroVideoOffset")
                meta.deleteProperty("http://ns.google.com/photos/1.0/camera/", "MicroVideoVersion")
                meta.deleteProperty("http://ns.google.com/photos/1.0/camera/", "MicroVideoPresentationTimestampUs")
    
                val copyBytes = photoFile.length() - offsetValue.value.toLong()
    
                val tmpImageWithoutVideo = createTmpFile(photoFile.name)
    
                FileInputStream (photoFile).use { inputStream ->
                    FileOutputStream(tmpImageWithoutVideo).use { outputStream ->
                        IOUtils.copyLarge(inputStream, outputStream, 0, copyBytes)
                    }
                }
    
                photoFile.delete()
    
                // Remove the XMP Motion values
                val newImageFile = createTempFile(photoFile.name)
    
                FileInputStream(tmpImageWithoutVideo).use { inputStream ->
                    FileOutputStream(newImageFile).use { outputStream ->
                        xmp.writeXMPMeta(inputStream, outputStream, meta)
                    }
                }
    
                tmpImageWithoutVideo.delete()
    
                photoFile = newImageFile
            }
    

    这是帮助我的nice page

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-27
      • 2014-01-11
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      • 1970-01-01
      • 2011-01-31
      相关资源
      最近更新 更多