ios是如何识别从ios 相机权限里面导进去的照片的地理位置的

如何处理iOS中照片的方向 - 简书
如何处理iOS中照片的方向
转载自:使用过iPhone或者iPad的朋友在拍照时不知是否遇到过这样的问题,将设备中的照片导出到Windows上时,经常发现导出的照片方向会有问题,要么横着,要么颠倒着,需要旋转才适合观看。而如果直接在这些设备上浏览时,照片会始终显示正确的方向,在Mac上也能正确显示。最近在iOS的开发中也遇到了同样的问题,将拍摄的照片上传到服务器后,再由Windows端下载该照片,发现手机上完全正常的照片到了这里显示的横七竖八。同一张照片为什么在不同的设备上表现的不同?如何能够避免这种情况?本文将和大家一一解开这些问题。目录照片的存储演变一切都得从相机的发展开始说起。胶片时代一般相机拍摄出来的画面都是长方形,在拍摄的那一瞬间,它会将取景器中的场景对应的颜色值存到对应的像素位置。相机本身并没有任何方向的概念,只是使用者想要拍摄的场景在他期望的照片中显示的方式与实际存在差异时,才有了方向一说。如下图,对一个场景F进行拍摄,相机的方向可能会有这样四个常见的角度:
相机是“自私”的,由于相机仅反应真实的场景,它不理解拍摄的内容,因此照片都以相机的坐标系保存,于是上面四种情形实际拍摄出来的照片会像这样:
最初的卡片机时代,照片都会经由底片洗出来。那时不存在照片的方向问题,因为不管我们以何种角度拍摄,最终洗出来的照片,它本身非常容易旋转,所以我们总可以通过简单的旋转来观看照片或者保存照片。比如这张照片墙中的照片,你能否说哪些照片是横着?哪些颠倒着?你甚至都无法判断每张照片相机是以何种角度拍摄的,因为每张都已经旋转至适合观看的角度。
数码时代可是到了数码时代,不再需要底片,照片需要被存成一个图像文件。对于上面的拍摄角度,存储方式并没有变化,所有的场景仍然是以相机的坐标系来保存。于是这些照片仍像上面一样,原封不动的保存了下来:
虽然存储方式不变,和卡机机时代的实体相片不同的是,由于电脑屏幕可没洗出来的照片那么容易旋转,所以照片只能够以它存储于磁盘中的方向来展示。这便是为何照片传到电脑上之后,会出现横了,或者颠倒的情况。正因为这样,我们只有利用工具来旋转照片才能够正常观看。方向传感器为了克服这一情况,让照片可以真实的反应人们拍摄时看到的场景,现在很多相机中就加入了方向传感器,它能够记录下拍摄时相机的方向,并将这一信息保存在照片中。照片的存储方式还是没有任何改变,它仍然是以相机的坐标系来保存,只是当相机来浏览这些照片时,相机可以根据照片中的方向信息,结合此时相机的方向,对照片进行旋转,从而转到适合人们观看的角度。但是很遗憾,这一标准并没有被广泛的传播开来,或者说始终如一的贯彻,这也导致了本文所讨论的问题。EXIF(Exchangeable Image File Format)那么,方向信息到底是记录在照片的什么位置?了解图像格式的朋友可能会知道,图像一般都由两大部分组成,一部分是数据本身,它记录了每个像素的颜色值,另外一部分是文件头,这里面记录着形如图像的宽度,高度等信息。我们所讨论的方向信息便是被存储于文件头中。更为具体一些:EXIF中,上对其的解释为:可交换图像文件格式常被简称为Exif(Exchangeable image file format),是专门为数码相机的照片设定的,可以记录数码照片的属性信息和拍摄数据… Exif可以附加于JPEG、TIFF、RIFF等文件之中注意:PNG格式的图像中不包含。Orientation在EXIF涵盖的各种信息之中,其中有一个叫做Orientation (rotation)的标签,用于记录图像的方向,这便是相机写入方向信息的最终位置。它总共定义了八个值:
注意:对于上面的八种方向中,加了*的并不常见,因为它们代表的是镜像方向,如果不做任何的处理,不管相机以任何角度拍摄,都无法出现镜像的情况。这个表格代表什么意义?我们来看第一行,值为1时,右边两列的值分别为:Row #0 isTop,Column #0 isLeft side,其实很好理解,它表示照片的第一行位于顶端,而第一列位于左侧,那么这张照片自然就是以正常角度拍摄的。对着前面的四种拍摄角度,由于相机都是以其自身的坐标系来保存照片,因此每张照片对应的第一行和第一列的位置始终如下:
我们来看第二张照片,这张照片需要逆时针旋转90度才能够正常观看。旋转之后,它的第一行位于左侧,而第一列位于下侧。如此一来,对比表格,它的Orientation值为8。所以说,这个Orientation值提供了想要正常观看图像时应该旋转的方式。以同样的方法,我们可以推断出上面四种方式拍摄时,对应EXIF中Orientation的值如下所示:
由于相机加上了方向传感器的缘故,可以非常容易的检测出以上几种拍摄角度,并将角度对应的Orientation值保存至图像中。查看图像时,相机检测到其EXIF中的Orientation信息,并将图像旋转相应的角度显示给用户,这样便达到了智能显示的目的。iPhone上的情况作为智能手机的重要组成部分,形形色色的传感器自然必不可少。在iOS的设备中也是包含了这样的方向传感器,它也采用了同样的方式来保存照片的方向信息到EXIF中。但是它默认的照片方向并不是竖着拿手机时的情况,而是横向,即Home键在右侧,如下:
如此一来,如果竖着拿手机拍摄时,就相当于对手机顺时针旋转了90度,也即上面相机图片中的最后一幅,那么它的Orientation值为6。
验证EXIF在经过上面的分析之后,我们来看看实际情况如何。我们分别在Mac和Windows平台上对前面的论述做一个验证。Mac平台可以将照片从iOS设备中导出到Mac系统上,(注意,不能够使用iPhoto或者Photos来导入,因为这样照片在导入之前会被自动调整好方向)在这里我们像Windows中一样,将iPhone当成移动硬盘,直接访问其照片。在Mac上可以使用这一神器。然后用Mac上的预览程序查看其EXIF属性,通过预览-工具-显示检查器打开对话框,即可查看到照片中关于方向的详细信息。下面四张图分别展示了上面四种方向下拍得照片的Orientation值:Home键位于右侧时,即相机的默认方向,值为1。
Home键位于上侧时,值为8。
Home键位于左侧时,值为3。
Home键位于下侧时,即正常手持手机的方向,值为6。
对照前面的分析,完全一致。而且照片显示正常,说明在Mac上默认的预览程序会自动的处理EXIF中的Orientation信息。再次提醒:照片存储在手机中始终是以相机坐标系保存的,只是浏览工作在读取方向信息之后做了旋转。Windows平台前面提到过,被写在图像文件头中的方向信息并没有被全部支持,Windows的照片查看器便是其中之一,这也是Windows用户最常使用的照片浏览工具。因为没有读取方向信息,照片被读入之后,完全按照其存储方式来显示,这样便出现了横向,或者颠倒的情况。下面四张图便分别是上一节中拍得的照片在Windows上的显示效果,注意看方向。
开发时如何避免既然不是所有的工具都支持方向属性,这其中甚至包含了具有最多用户群体的Windows,那么我们在开发照片相关的应用时,有没有什么应对之策?当然有!因为可以非常容易的得到照片的方向信息,那么只需要在保存之前将照片旋转至正常观看的方向即可,然后直接将最终具有正确方向的照片保存下来,搞定。当我们得到一个UIImage对象时,它有一个属性叫:imageOrientation,这里面便保存了方向信息:PropertyThe orientation of the receiver’s image. (read-only)DiscussionImage orientation affects the way the image data is displayed when drawn. By default, images are displayed in the “up” orientation. If the image has associated metadata (such as EXIF information), however, this property contains the orientation indicated by that metadata. For a list of possible values for this property, see UIImageOrientation.它刚好也可能为下面八种值,这些值可以和EXIF中Orientation的定义一一对应:
UIImageOrientationUp
UIImageOrientationDown
UIImageOrientationLeft
UIImageOrientationRight
UIImageOrientationUpMirrored
UIImageOrientationDownMirrored
UIImageOrientationLeftMirrored
UIImageOrientationRightMirrored那么我们便可以根据这一属性对图像进行相应的旋转,从而将图像的原始数据旋转至正确的方向,在浏览照片时无需方向信息便可正常浏览。关于如何旋转图像,StackOverflow上给出了很好的答案,比如。我们简单做一个介绍:直观的解决方案首先,为UIImage创建一个category,其中包含fixOrientation方法:UIImage+fixOrientation.h1@interfaceUIImage(fixOrientation)23-(UIImage*)fixO45@endUIImage+fixOrientation.m1@implementationUIImage(fixOrientation)23-(UIImage*)fixOrientation{45// No-op if the orientation is already correct6if(self.imageOrientation==UIImageOrientationUp)78// We need to calculate the proper transformation to make the image upright.9// We do it in 2 steps: Rotate if Left/Right/Down, and then flip if Mirrored.10CGAffineTransformtransform=CGAffineTransformI1112switch(self.imageOrientation){13caseUIImageOrientationDown:14caseUIImageOrientationDownMirrored:15transform=CGAffineTransformTranslate(transform,self.size.width,self.size.height);16transform=CGAffineTransformRotate(transform,M_PI);171819caseUIImageOrientationLeft:20caseUIImageOrientationLeftMirrored:21transform=CGAffineTransformTranslate(transform,self.size.width,0);22transform=CGAffineTransformRotate(transform,M_PI_2);232425caseUIImageOrientationRight:26caseUIImageOrientationRightMirrored:27transform=CGAffineTransformTranslate(transform,0,self.size.height);28transform=CGAffineTransformRotate(transform,-M_PI_2);2930caseUIImageOrientationUp:31caseUIImageOrientationUpMirrored:switch(self.imageOrientation){36caseUIImageOrientationUpMirrored:37caseUIImageOrientationDownMirrored:38transform=CGAffineTransformTranslate(transform,self.size.width,0);39transform=CGAffineTransformScale(transform,-1,1);404142caseUIImageOrientationLeftMirrored:43caseUIImageOrientationRightMirrored:44transform=CGAffineTransformTranslate(transform,self.size.height,0);45transform=CGAffineTransformScale(transform,-1,1);4647caseUIImageOrientationUp:48caseUIImageOrientationDown:49caseUIImageOrientationLeft:50caseUIImageOrientationRight:// Now we draw the underlying CGImage into a new context, applying the transform55// calculated above.56CGContextRefctx=CGBitmapContextCreate(NULL,self.size.width,self.size.height,57CGImageGetBitsPerComponent(self.CGImage),0,58CGImageGetColorSpace(self.CGImage),59CGImageGetBitmapInfo(self.CGImage));60CGContextConcatCTM(ctx,transform);61switch(self.imageOrientation){62caseUIImageOrientationLeft:63caseUIImageOrientationLeftMirrored:64caseUIImageOrientationRight:65caseUIImageOrientationRightMirrored:66// Grr...67CGContextDrawImage(ctx,CGRectMake(0,0,self.size.height,self.size.width),self.CGImage);686970default:71CGContextDrawImage(ctx,CGRectMake(0,0,self.size.width,self.size.height),self.CGImage);// And now we just create a new UIImage from the drawing context76CGImageRefcgimg=CGBitmapContextCreateImage(ctx);77UIImage*img=[UIImageimageWithCGImage:cgimg];78CGContextRelease(ctx);79CGImageRelease(cgimg);@end代码有些长,不过却非常直观。这里面涉及到图像矩阵变换的操作,理解起来可能稍稍有些困难,接下来,我会有另外一篇文章专门来介绍图像变换。现在,记住下面两点便能够很好的帮助理解:图像的原点在左下角矩阵变换时,后面的矩阵先作用,前面的矩阵后作用以UIImageOrientationDown方向为例,
,很明显它翻转了180度。那么对它的旋转需要两步,第一步是以左下方为原点旋转180度,(此时顺时针还是逆时针旋转效果一样)旋转后上图变为:
。用代码表示为:1transform=CGAffineTransformRotate(transform,M_PI);因为是以左下方为原点旋转的,所以整幅图被移到了第三象限。第二步需要将其平移至第一象限,向右上方进行平移即可。x方向上移动距离为图像的宽度,y方向上移动距离为图像的高度,所以平移后图像变为:
。代码为:1transform=CGAffineTransformTranslate(transform,self.size.width,self.size.height);再加上我们前面所说的第二点,矩阵变换时,后面的矩阵先作用,前面的矩阵后作用,那么只需要将上面两步颠倒即可:1transform=CGAffineTransformTranslate(transform,self.size.width,self.size.height);2transform=CGAffineTransformRotate(transform,M_PI);其它的方向可以用完全一样的方法来分析,这里不再一一赘述。第二种简单的方法第二种方法同样也是StackOverflow上的,没那么直观,但非常简单:1-(UIImage*)normalizedImage{2if(self.imageOrientation==UIImageOrientationUp)34UIGraphicsBeginImageContextWithOptions(self.size,NO,self.scale);5[selfdrawInRect:(CGRect){0,0,self.size}];6UIImage*normalizedImage=UIGraphicsGetImageFromCurrentImageContext();7UIGraphicsEndImageContext();8returnnormalizedI9}这里是利用了UIImage中的drawInRect方法,它会将图像绘制到画布上,并且已经考虑好了图像的方向,开发文档这样解释:-drawInRect:Draws the entire image in the specified rectangle, scaling it as needed to fit.DiscussionThis method draws the entire image in the current graphics context, respecting the image’s orientation setting. In the default coordinate system, images are situated down and to the right of the origin of the specified rectangle. This method respects any transforms applied to the current graphics context, however.结尾关于照片方向的处理就介绍到这里,相信看完本文你已经知悉为何以及如何处理这个问题。关于EXIF,这里面包含了很多有趣的内容,比如iPhone拍摄后,可以记录当时的GPS位置,这样在查看照片的时候就可以很神奇的知道照片的拍摄地。如果感兴趣可以去一探究竟。另外,除去专门的照片浏览工具,所有的现代浏览器也天生具备查看图片的功能。而且有很多浏览器也已经支持EXIF中的Orientation,比如Firefox, Chrome, Safari。但同样很可惜,IE并不支持(一直到IE9.0尚不支持)。也许和Win7设计时并没有这些具有方向传感器的手机有关,我从网上了解到,在当初2012年收集building Windows8意见时,就有人提到过这一问题,希望能够考虑图片的方向信息,微软也给出了:(In Windows8)Explorer now respects EXIF orientation information for JPEG images. If your camera sets this value accurately, you will rarely need to correct orientation.但我一直没有用过Windows8,如果有使用过的,希望可以帮我验证一下是否微软已经修复这个问题。(全文完)
滕王高阁临江渚,珮玉鸣鸾罢歌舞。
http://feihu.me/blog/2015/how-to-handle-image-orientation-on-iOS/ 使用过iPhone或者iPad的朋友在拍照时不知是否遇到过这样的问题,将设备中的照片导出到Windows上时,经常发现导出的照片方向会有问题,...
转载链接http://www.cocoachina.com/ios/21.html作者blog地址http://feihu.me/ 使用过iPhone或者iPad的朋友在拍照时不知是否遇到过这样的问题,将设备中的照片导出到Windows上时,经常发现...
public classCamera.Parametersextends Objectjava.lang.Object ?android.hardware.Camera.Parameters Class Overview 类概述相机的服务设置。使相机参数生效,应用程序必须调...
问题起源:竖屏应用的预览图像和拍摄的照片均旋转了90度 这个问题的原因是,在Android系统中定义了相机传感器方向,这个方向默认为:当你面对屏幕时,横置手机,如果摄像头靠近上方,那么此时即默认方向。当竖立手机,且前置、后置摄像头都在上方时,前置摄像头的旋转角度为270,后...
原文链接http://www.cnblogs.com/kenshincui/p/4186022.html 音频在iOS中音频播放从形式上可以分为音效播放和音乐播放。前者主要指的是一些短音频播放,通常作为点缀音频,对于这类音频不需要进行进度、循环等控制。后者指的是一些较长的音...
面试官经常会问你未来5年或10年内的职业目标是什么,有没有职业规划,你是如何规划的,很多朋友不知从何说起,因为他根本就没有考虑过这些问题。那遇到这问题应该如何回答呢? 其实在回答这个问题你要做好三个准备: 1. 确定目标 目标的确定需要与自己专业或是兴趣爱好相关,也要与应聘...
关于LpLOpenDay LpLOpenDay是由《英雄联盟》项目组主办,PentaQ协助发起,L.ACE、香蕉计划及各俱乐部支持的一次《英雄联盟》线下主题活动。 2015年8月第一届LPLOpenday完美落幕后,2016年3月第二届便紧锣密鼓的开启。第二届的Openda...
娱乐的变迁 人总需要娱乐。繁重的工作之后,娱乐可以缓解身心的疲劳。一次工作和另一次工作之间,娱乐可以填充期间的空虚。毫无疑义,娱乐还可以增加生命的色彩。不可想象,只有工作没有娱乐的生活,多么单调、黯淡,令人难以忍受。有时候,能够娱乐,也是意志自由的表现。 娱乐的形式很多。运...
假如能穿越时空,我会邀请你来到草原,来到美丽的包头,去了解那段百年文化,那段晋商从这里发迹的地方,去看古老的驼道,去听那远去的驼铃声,假如你愿分享草原往事,那就跟着我的心,一起去穿越时空,一起走进这里,这片水草丰美的地方,这片梅花鹿的家园,这里有莲花般的蒙古包,有热情好客的...
day2 晚起了20分钟,加上今天7cm高跟鞋拖累了我的速度,所以来公司已经9点20了,主管说以后要9点之前到。看来以后只能相信早起不能相信地铁会变快。 今天的工作内容依然是刷学时,眼睛又盯了一天,中餐在公司吃的领导多出来的一份饭。下班回家,8点到。房子还没找到,最近的几个...后使用快捷导航没有帐号?
只需一步,快速开始
查看: 172898|回复: 29
积分4012精华0主题帖子威望164 活跃5493 PP币1518 PP豆293 阅读权限90最后登录
TA的每日心情怒 15:33签到天数: 562 天连续签到: 1 天[LV.9]以坛为家II威望164 活跃5493 PP币1518 PP豆293
本帖最后由 abon 于
11:34 编辑
PP助手导入照片至相机胶卷教程
一、将设备连接到电脑端的PP助手,点击【照片】--然后点击右上角的‘显示所有相簿’按钮,显示出来相机胶卷后点击进去。
18:14 上传
二、打开相机胶卷后,再点击【导入】按钮,选择导入文件后,PP助手就会弹框提示“导入相片到相机胶卷”的提示,点击提示框里的 【安装PP相机】按钮,等待PP助手安装PP照片。
18:14 上传
三、安装完毕后,打开手机端的【PP照片】程序图标,若此时电脑端的PP助手在导入相片的时候,手机端的【PP照片】就会提示“PP照片”想访问您的照片&&点击“好”
18:14 上传
18:14 上传
四、等待导入成功后,即可直接在相机胶卷里浏览或者删除从电脑上导入的照片文件。
18:14 上传
积分4634精华0主题帖子威望269 活跃7816 PP币100 PP豆27 阅读权限90最后登录
, 积分 4634, 距离下一级还需 366 积分
TA的每日心情擦汗 22:32签到天数: 128 天连续签到: 0 天[LV.7]常住居民III威望269 活跃7816 PP币100 PP豆27 设备iPhone5
积分8576精华0主题帖子威望186 活跃15562 PP币1199 PP豆-1260 阅读权限90最后登录
, 积分 8576, 距离下一级还需 1424 积分
TA的每日心情奋斗 10:31签到天数: 319 天连续签到: 0 天[LV.8]以坛为家I威望186 活跃15562 PP币1199 PP豆-1260
积分82精华0主题帖子威望0 活跃124 PP币157 PP豆81 阅读权限10最后登录
, 积分 82, 距离下一级还需 18 积分
TA的每日心情开心 17:09签到天数: 17 天连续签到: 0 天[LV.4]偶尔看看III威望0 活跃124 PP币157 PP豆81 设备iPad 3/4
积分56精华0主题帖子威望11 活跃30 PP币270 PP豆0 阅读权限10最后登录
, 积分 56, 距离下一级还需 44 积分
TA的每日心情奋斗 10:31签到天数: 7 天连续签到: 0 天[LV.3]偶尔看看II威望11 活跃30 PP币270 PP豆0 设备iPad Mini
为何导入的照片没年度,地点等信息?
积分7精华0主题帖子威望0 活跃7 PP币19 PP豆0 阅读权限10最后登录
, 积分 7, 距离下一级还需 93 积分
该用户从未签到威望0 活跃7 PP币19 PP豆0 设备iPhone5
{:7_299:}.................
积分712精华0主题帖子威望5 活跃1280 PP币67 PP豆49 阅读权限10最后登录
, 积分 712, 距离下一级还需 88 积分
TA的每日心情奋斗 10:31签到天数: 49 天连续签到: 0 天[LV.5]常住居民I威望5 活跃1280 PP币67 PP豆49 设备iPad Mini
楼主好了,学习来了
积分204精华0主题帖子威望1 活跃193 PP币712 PP豆10 阅读权限10最后登录
, 积分 204, 距离下一级还需 96 积分
TA的每日心情奋斗 10:31签到天数: 121 天连续签到: 0 天[LV.7]常住居民III威望1 活跃193 PP币712 PP豆10 设备iPhone 6 Plus
本帖最后由 xlszzck 于
19:37 编辑
试过几次后,成功了。一定要在PP助手上双击打开相机胶卷才能导入进去。
积分4精华0主题帖子威望0 活跃2 PP币29 PP豆0 阅读权限10最后登录
, 积分 4, 距离下一级还需 96 积分
TA的每日心情奋斗 10:31签到天数: 2 天连续签到: 0 天[LV.1]初来乍到威望0 活跃2 PP币29 PP豆0
东西是挺好用的,就是没年度,地点等信息,可否改进下呢?
积分2精华0主题帖子威望0 活跃2 PP币19 PP豆0 阅读权限10最后登录
, 积分 2, 距离下一级还需 98 积分
该用户从未签到威望0 活跃2 PP币19 PP豆0 设备iPhone5
我装的时候没有提示安装PP图片怎么办啊
授予离职版主的专属勋章
论坛回帖之王
论坛雷锋好模范
发表1000篇以上文章会员
热心分享资源超过500个的会员
Copyright&
Guangzhou UC Network Technology Co., Ltd. All Rights Reserved. 广州优视网络科技有限公司 版权所有博主最新文章
博主热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)  喜欢用iPhone拍照的用户应该都知道,iPhone上最酷的一件事就是可以利用定位服务标记你的相机功能。这样,你所拍到的照片就会同时附上具体的拍照地点,对图片进行分类的时候就不用再大伤脑筋了。  当然,你的iOS7设备同样也可以通过相同的操作来实现照片定位。在此,我们不厌其烦地再赘述一遍。首先,你需要在打开的定位服务中启用相机功能。具体步骤:点击进入设置,点选隐私,启用定位服务,向下滑动找到相机功能并开启应用。通过简单的设置,你的iPhone就可以启用拍照定位功能了。  进入照片库,采用年份、收藏或时刻来分类引导显示,你会在每一个分类的照片群上方看到这些照片的拍摄地点,点击这些位置标头,与这个节点相关的所有照片就会出现在地图上。然后,你可以通过缩小图片的方式在地图上查找更具体的拍照位置。  值得提醒的一点是,有的用户可能会喜欢将照片导出并存储到另一台手机上,由于照片定位一般仅适用于原手机,所以换机后原有的定位信息将不会跟着照片被导入。来源weiphone)博主最新文章
博主热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)}

我要回帖

更多关于 ios 相机权限 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信