在过去的几个星期里,我一直在处理目标 c 中的图像,并注意到许多奇怪的行为。首先,像许多其他人一样,我一直有这样一个问题: 用相机拍摄的图像(或者用别人的相机拍摄的,对我来说是彩信)旋转90度。我不知道为什么世界上会发生这种事(因此 我的问题) ,但我能够想出一个廉价的工作左右。
我这次的问题是 为什么会这样?为什么苹果会旋转图片?当我用相机拍照时,除非我执行上面提到的代码,否则当我保存照片时,它会被旋转保存。直到几天前,我的变通方法还是可行的。
我的应用程序修改图像的单个像素,特别是 PNG 的 alpha 通道(因此在我的场景中,任何 JPEG 转换都会被抛出窗外)。几天前我注意到,虽然图像在我的应用程序中显示得很好,这要归功于我的解决方案代码,但当我的算法修改图像的单个像素时,它认为图像是旋转的。因此,它不修改图像顶部的像素,而是修改图像侧面的像素(因为它认为应该旋转) !我不知道如何在内存中旋转图像-理想情况下,我宁愿擦掉所有的 imageOrientation
标志。
还有一件事也一直困扰着我... ... 当我拍照时,imageOrientation
设置为3。我的工作区代码足够聪明,能够意识到这一点并翻转它,这样用户就不会注意到。此外,我的代码保存图像库意识到这一点,翻转它,那么保存它,以便它出现在相机滚动正确。
代码看起来是这样的:
NSData* pngdata = UIImagePNGRepresentation (self.workingImage); //PNG wrap
UIImage* img = [self rotateImageAppropriately:[UIImage imageWithData:pngdata]];
UIImageWriteToSavedPhotosAlbum(img, nil, nil, nil);
当我加载这个新保存的图像到我的应用程序中时,imageOrientation
是0-正是我想要看到的,我的旋转工作区甚至不需要运行(注意: 当从互联网上加载图像而不是用照相机拍摄的图像时,imageOrientation
总是0,导致完美的行为)。由于某种原因,我的保存代码似乎擦除这个 imageOrientation
标志。我本来只是希望在用户拍摄照片并添加到应用程序中的时候,窃取这段代码,然后用它来擦除我的图像定位功能,但是它似乎不起作用。UIImageWriteToSavedPhotosAlbum
对 imageOrientation
有什么特别的功能吗?
对于这个问题最好的解决办法是只要用户一完成拍摄图像就吹走 imageOrientation
。我认为苹果公司的旋转行为是有原因的,对吗?一些人认为这是苹果的缺陷。
(... ... 如果你还没有迷路... ... 注2: 当我拍横向照片时,一切看起来都很完美,就像从网上拍的照片一样)
编辑:
下面是一些图片和场景的实际样子。从目前的评论来看,这种奇怪的行为似乎不仅仅是 iPhone 的行为,我认为这是好事。
这是我用手机拍的照片(注意正确的方向) ,它看起来和我在手机上拍照时一模一样:
下面是我发给自己的图片在 Gmail 中的样子(看起来 Gmail 处理得很好) :
下面是图像在窗口中看起来像一个缩略图(看起来处理不当) :
下面是用 Windows相片检视器打开的实际图像(仍然处理不当) :
在所有关于这个问题的评论之后,下面是我的想法... iPhone 拍摄了一张图片,并说“为了正确显示,它需要旋转90度”。这些信息将出现在 EXIF 数据中。(为什么它需要旋转90度,而不是默认垂直,我不知道)。从这里开始,Gmail 可以很聪明地读取和分析 EXIF 数据,并正确地显示它。但是,Windows 不够聪明,无法读取 EXIF 数据,因此显示图像 不正当地。我的假设正确吗?