Exif图片方向的一些发现

电脑杂谈  发布时间:2019-08-13 14:04:41  来源:网络整理

手机exif查看器_手机怎么查看exif_手机如何查看exif信息

2、背景

首先,先要了解Exif是个多少玩意,搬走百度百科

可交换图像文件文档(音标:Exchangeable image file format,官方简称Exif),是专门为数码相机的原图设定的,可以记录数码相片的特性资料和拍摄数据。

可交换图像文件文档(音标:Exchangeable image file format,官方简称Exif),是专门为数码相机的原图设定的,可以记录数码相片的特性资料和拍摄数据。

说到底Exif就是一种格式,用于存储网络的一些资料,它们资料和我们日常比较相关的有拍摄装置,拍摄地点,网络尺寸等,所以今天的配角是另外一个——那就是图片方向(orientation)。这个网络方向不是指我们平时使用图片编辑器旋转的方向,而是拍照时电脑的方向。

总共有八个方向:

下图是JPEG ORIENTATION对应网络方向的纠正算法,这儿它通过三位二进制数代表八种方向手机怎么查看exif,然后再通过每一位二进制数对应不同的操作来对网络进行纠正,如下:

#d8c9f87adb3452f6e7eeac309e9222d#

https://magnushoff.com/jpeg-orientation.html

最高位二进制数代表对角线翻转的操作,第二位二进制数代表旋转180度的操作,最短期代表水平转动的操作。例如001,就是水平转动,不过可以见到001的图例和原图形关于水平轴对称。通过把八个方向的图例用3个二进制数即三种操作组合,就可以很方便的对图形做切换,编码伪代码如下:

if( value& 100b != ) image.flip- diagonally

if(value& 010b != ) image.rotate-180

if(value& 001b != ) image.flip-horizontally

那有人就会困惑了,自己这么平时没有看到这样网络呢,这是因为我们使用的网络查看器或者是浏览器对orientation做了兼容,会对展示的网络做切换。

如下是windows文件夹的展示:

上面则是Android Studio的网络展示

手机如何查看exif信息_手机exif查看器_手机怎么查看exif

还是可以见到,windows是默认对网络orientation做了处理,而Android的ImageView则没有处理虽然见到的是网络其实的方向。

这是八个F的网络链接

https://magnushoff.com/assets/test-exiforientation.zip

3、应用

在Android里面,三星手机的自拍是个奇葩的存在,我下面用的电脑就是三星手机,三星手机的exif是旋转90度,别家电脑则是0度,不过三星手机的原图需要做处理,这儿是一张三星手机照片的exif信息:

三星手机的方向是Rotate 90CW,含义就是需要顺时针方向(ClockWise)旋转90度。脑壳转的快的班级可以对照下面的F图,肯定很快看出是101这张图。

那我们放入图片的orientation值进行验证:

try{

valexifInterface = ExifInterface(resources.openRawResource(id))

valorientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL)

Log.e( "orientation", orientation.toString())

} catch(e: IOException) {

e.printStackTrace()

}

打印结果是6,和下面的101对不上,本来在Android的orientation是需要做减1处理的,也就是说6其实对应的是101这种状况。

如果,需要注意的是,或者打印结果是,假如证明网络没有orientation这个资料。

那接下来我们进行编码,这是第一张方式:

valoptions = BitmapFactory.Options()

手机怎么查看exif_手机如何查看exif信息_手机exif查看器

varbitmap = BitmapFactory.decodeResource(resources, R.mipmap.error_orientation, options)

valmatrix = Matrix()

matrix.postRotate(getOrientation(R.mipmap.error_orientation).toFloat())

bitmap = Bitmap.createBitmap(bitmap, , , bitmap.width, bitmap.height, matrix, true)

imageview.setImageBitmap(bitmap)

privatefungetOrientation(id:Int): Int{

vardegree =

try{

valexifInterface = ExifInterface(resources.openRawResource(id))

valorientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL)

when(orientation) {

ExifInterface.ORIENTATION_ROTATE_90 -> degree = 90

ExifInterface.ORIENTATION_ROTATE_180 -> degree = 180

ExifInterface.ORIENTATION_ROTATE_270 -> degree = 270

}

} catch(e: IOException) {

e.printStackTrace()

}

returndegree

手机如何查看exif信息_手机怎么查看exif_手机exif查看器

}

一般来说,我们只需要处理这三种视角手机怎么查看exif,下面三个角度对应的orientation是6 3 8,也就是101,010,111这三种状况。为什么一般只需要处理这三种状况呢,自己脑补一下拿长焦的视角,不外乎就四种现象,除了正常的现象下,不就只需要处理三种现象吗?

嘿嘿,我真是个小机灵鬼。

同样,或者要严谨一点,还是需要根据JPEG那种操作手段来,如下:

valoptions = BitmapFactory.Options()

varbitmap = BitmapFactory.decodeResource(resources, R.mipmap.f7t, options)

valmatrix = genOrientationMatrix(R.mipmap.f7t)

bitmap = Bitmap.createBitmap(bitmap, , , bitmap.width, bitmap.height, matrix, true)

imageview.setImageBitmap(bitmap)

privatefungenOrientationMatrix(id:Int): Matrix {

valmatrix = Matrix()

try{

valexifInterface = ExifInterface(resources.openRawResource(id))

varorientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL)

if(orientation > ) {

orientation--

if(orientation and 0b100 != ) { //对角线翻转

matrix.postScale( -1.0f, 1.0f)

matrix.postRotate( -90f)

手机如何查看exif信息_手机怎么查看exif_手机exif查看器

}

if(orientation and 0b010 != ) { //旋转180度

matrix.postRotate( 180f)

}

if(orientation and 0b001 != ) { //水平转动

matrix.postScale( -1.0f, 1.0f)

}

}

returnmatrix

} catch(e: IOException) {

e.printStackTrace()

}

returnmatrix

}

同样就是将JPEG对于orientation的切换利用源码进行实现,对矩阵进行相应的变换。

4、总结

Exif是一种存储了相册一些资料的文档,平常我们在进行Android开发的时候,一般需要权衡方向的难题,反而在日常生活,这个应该暴露我们隐私的入口,不过电脑在拍照的时候,最好将保存位置其他选项关掉,规避泄漏自己的隐私。

参考

Android性能优化:网络保存,还会更快https://xiazdong.github.io/2017/03/28/Android%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96%EF%BC%9A%E5%9B%BE%E7%89%87%E4%BF%9D%E5%AD%98%EF%BC%8C%E8%BF%98%E8%83%BD%E6%9B%B4%E5%BF%AB/

JPEG Orientation https://magnushoff.com/jpeg-orientation.html

●编号377,输入编号直达本文


本文来自电脑杂谈,转载请注明本文网址:
http://xinshanjie.com/a/ruanjian/article-119099-1.html

    相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...