iPhone从core data中加载的UIImage逆时针旋转90度,如何修复?

4

我正在使用AVCaptureSession从相机捕获图像:

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection

图像被转换为UIImage,并添加到图像视图中。如预期的那样,图像以纵向方向显示。
我试图在捕获会话之间将图像保存到核心数据中。我的核心数据实体具有二进制数据类型的图像属性。
coreDataEntity.image = UIImagePNGRepresentation(imageView.image);

当用户重新加载以前保存的会话时,图像视图使用以下方法恢复其图像:

 imageView.image = [UIImage imageWithData:coreDataEntity.image];

然而,已恢复的图像逆时针旋转90度,其顶部指向左侧。

图像在什么时候被旋转? 是在保存期间还是在从核心数据加载期间?

我有一个将UIImage旋转90度的方法,但似乎在随后重新加载相同的图像时,它会额外旋转90度。如何知道我已经旋转过UIImage一次?

感谢任何帮助!


3
你可能想看看这篇帖子:https://dev59.com/Y3A65IYBdhLWcg3w7Taa。 - graver
5个回答

11

一年过去了,您可能已经自己解决了这个问题,但最近我自己也遇到了这个问题,并想分享我的解决方案。

我将存储的图像格式更改为JPEG。

更改

coreDataEntity.image = UIImagePNGRepresentation(imageView.image);

coreDataEntity.image = UIImageJPEGRepresentation(imageView.image,1.0f);

图像恢复为之前的状态

imageView.image = [UIImage imageWithData:coreDataEntity.image];

希望这对某人有所帮助。


5

我不会强制要求在数据库中使用某种格式。通过在存储到数据库之前将其转换为PNG格式,您正在删除可能需要的信息(例如方向)。

如果我的假设是正确的,请尝试像这样序列化UIImage:

[NSKeyedArchiver archivedDataWithRootObject:image]

使用此方法进行序列化和反序列化
[NSKeyedUnarchiver unarchiveObjectWithData:imageData]

此外,请务必查看NSValueTransformer,它可以封装此转换,以便在其工作后您永远不必再处理它。

你能举个NSValueTransformer封装的例子吗?我不是很明白那一步。 - zakdances

2

使用

let imageData = image.jpegData(compressionQuality: 1)

替代

let imageData = image.pngData()

1

我猜测这不是在加载或保存时发生的。我觉得很可疑的是你有一个将图像旋转90度的方法,而这正是你的图像正在发生的事情。尝试修改你的方法以不同的角度进行旋转(例如零度),看看它是否影响了你的错误。我怀疑你的旋转方法被调用了,而你并不知道。

另一个可能性是你拍照时将iPhone/iPad横向拿着,但你的应用程序不支持设备旋转。

你的帖子中真的没有太多信息,所以我只是在瞎猜 :)


谢谢你的建议!在发现了那个 bug 之后,我得到了旋转方法,所以这不是旋转方法的问题。相反,我想在找到根本原因后使用它来解决问题。 - Alex Stone

1

在将图像保存为pngData()之前,调用此函数并在此处使用返回的图像:

 func rotatedCopy() -> UIImage {
    if self.imageOrientation == UIImage.Orientation.up {
        return self
    }

    UIGraphicsBeginImageContext(size)

    //draws the image in current context respecting orientation
    draw(in: CGRect(origin: CGPoint.zero, size: size))
    let copy = UIGraphicsGetImageFromCurrentImageContext()

    UIGraphicsEndImageContext()

    return copy!
 }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接