Boe*_*ckm 26 iphone png exif objective-c ios
在我写的iOS应用程序中,我处理PNG因为我处理alpha通道.出于某种原因,我可以将PNG加载到我的imageView正常状态,但是当需要将图像从我的应用程序中复制出来(到PasteBoard上)或将图像保存到我的相机胶卷时,图像会旋转90度.
我在这里搜索过,我学到的一件事是,如果我使用JPEG,由于EXIF信息,我不会有这个问题(听起来).
我的应用程序具有完整的复制/粘贴功能,这里是踢球者(我会在步骤中编写它以便更容易理解):
我100%确定我的复制和粘贴代码没有错在这里,因为如果我回到上面的第2步,然后单击"保存",照片将保存到我的库,但它旋转了90度!
更奇怪的是它似乎与从互联网上下载的图像一起工作正常,但是我手动用手机拍摄的图像非常受欢迎.有些它有效,有些则不...
有没有人对此有任何想法?我可以使用任何可能的工作吗?我对代码非常有信心,因为它适用于大约75%的图像.我可以根据要求发布代码.
小智 26
对于那些需要Swift解决方案的人,创建UIImage的扩展并添加以下方法:
func correctlyOrientedImage() -> UIImage {
if self.imageOrientation == .up {
return self
}
UIGraphicsBeginImageContextWithOptions(size, false, scale)
draw(in: CGRect(x: 0, y: 0, width: size.width, height: size.height))
let normalizedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return normalizedImage ?? self;
}
Run Code Online (Sandbox Code Playgroud)
Don*_*mer 14
如果由于现有的图像imageOrientation属性而出现问题,则可以构建具有不同方向的其他相同图像,如下所示:
CGImageRef imageRef = [sourceImage CGImage];
UIImage *rotatedImage = [UIImage imageWithCGImage:imageRef scale:1.0 orientation:UIImageOrientationUp];
Run Code Online (Sandbox Code Playgroud)
您可能需要尝试在替换图像上设置的方向,可能会根据您开始的方向进行切换.
还要留意你的内存使用情况.摄影应用程序经常耗尽,这将使每张照片的存储空间翻倍,直到您发布源图像.
Boe*_*ckm 13
花了几天时间,但我终于想通了@Dondragmer发布的答案.但我想我会发布完整的解决方案.
所以基本上我必须编写一种方法来智能地自动旋转我的图像.缺点是我必须在我的代码中随处调用这种方法,这是一种处理器密集型,特别是在移动设备上工作时,但更好的一面是我可以拍摄图像,复制图像,粘贴图像,保存图像和它们都旋转得很好.这是我最终使用的代码(该方法尚未100%完成,仍然需要编辑内存泄漏,什么不是).
我最终了解到第一次将图像插入到我的应用程序中(无论是由于用户按下"拍摄图像","粘贴图像"或"选择图像",由于某种原因它插入就好了没有自动此时,我将所有旋转值存储在一个名为的全局变量中imageOrientationWhenAddedToScreen.这使我的生活更轻松,因为当操作图像并将图像保存到程序之外时,我只是检查了这个缓存的全局变量,确定我是否需要正确旋转图像.
- (UIImage*) rotateImageAppropriately:(UIImage*) imageToRotate {
//This method will properly rotate our image, we need to make sure that
//We call this method everywhere pretty much...
CGImageRef imageRef = [imageToRotate CGImage];
UIImage* properlyRotatedImage;
if (imageOrientationWhenAddedToScreen == 0) {
//Don't rotate the image
properlyRotatedImage = imageToRotate;
} else if (imageOrientationWhenAddedToScreen == 3) {
//We need to rotate the image back to a 3
properlyRotatedImage = [UIImage imageWithCGImage:imageRef scale:1.0 orientation:3];
} else if (imageOrientationWhenAddedToScreen == 1) {
//We need to rotate the image back to a 1
properlyRotatedImage = [UIImage imageWithCGImage:imageRef scale:1.0 orientation:1];
}
return properlyRotatedImage;
}
Run Code Online (Sandbox Code Playgroud)
我仍然不能100%肯定为什么Apple有这种奇怪的图像旋转行为(试试这个......拿起你的手机并将其翻转并拍照,你会注意到最后的图片是正确的 - 也许这这就是为什么Apple有这种功能?).
我知道我花了很多时间搞清楚这一点,所以我希望它能帮助其他人!
Joe*_*Joe 13
这种"奇怪的轮换"行为真的不是那么奇怪.它很聪明,聪明的我指的是内存效率.旋转iOS设备时,相机硬件随之旋转.当您拍摄照片时,将拍摄照片,但相机是朝向的.UIImage能够使用这些原始图片数据而无需复制,只需跟踪它应该处于的方向.当您使用时UIImagePNGRepresentation(),丢失此方向数据并获取相机拍摄的基础图像的PNG.要修复此问题而不是旋转,您可以告诉原始图像将自己绘制到新的上下文并UIImage从该上下文中获得正确的方向.
UIImage *image = ...;
//Have the image draw itself in the correct orientation if necessary
if(!(image.imageOrientation == UIImageOrientationUp ||
image.imageOrientation == UIImageOrientationUpMirrored))
{
CGSize imgsize = image.size;
UIGraphicsBeginImageContext(imgsize);
[image drawInRect:CGRectMake(0.0, 0.0, imgsize.width, imgsize.height)];
image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
}
NSData *png = UIImagePNGRepresentation(image);
Run Code Online (Sandbox Code Playgroud)