在过去的几周中,我一直在用Objective-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
标志。我希望只是窃取该代码,并在用户拍摄照片并将其添加到应用程序后立即使用它擦除我的imageOrientation,但似乎不起作用。有UIImageWriteToSavedPhotosAlbum
什么特别之处imageOrientation
吗?
解决此问题的最佳方法是imageOrientation
在用户完成拍摄图像后立即吹走。我认为苹果的旋转行为是有原因的,对吧?少数人认为这是苹果的缺陷。
(...如果您还没有迷路,请注意...)注2:当我拍摄水平照片时,一切似乎都可以正常工作,就像从互联网上拍摄的照片一样)
编辑:
这是一些实际的图像和场景。根据到目前为止的评论,看起来这种奇怪的行为不只是iPhone行为,我认为还不错。
这是我用手机拍摄的照片的图片(请注意正确的方向),它的外观与拍摄照片时在手机上的外观完全相同:
这是我通过电子邮件将图像发送给自己后在Gmail中的外观(看起来Gmail可以正确处理):
这是图像在Windows中作为缩略图的样子(看起来好像处理不当):
这是使用Windows Photo Viewer打开时的实际图像外观(仍然无法正确处理):
在对这个问题进行了所有评论之后,这就是我的想法... iPhone拍摄了一张图像,并说“要正确显示此图像,必须将其旋转90度”。此信息将在EXIF数据中。(我不知道为什么它需要旋转90度,而不是默认为笔直垂直)。从这里开始,Gmail足够智能,可以读取和分析该EXIF数据并正确显示。但是,Windows不够智能,无法读取EXIF数据,因此无法正确显示图像。我的假设正确吗?