使用UIIImagePicker的CGAffineTransform来缩放UIImage并保存到Parse SDK

4
我使用以下代码来对我的UIImagePickerController进行缩放。
    CGAffineTransform translate = CGAffineTransformMakeTranslation(0.0, 71.0); //This slots the preview exactly in the middle of the screen by moving it down 71 points
    self.imagePicker.cameraViewTransform = translate;
    CGAffineTransform scale = CGAffineTransformScale(translate, 1.333333, 1.333333);
    self.imagePicker.cameraViewTransform = scale;

然后我将图片放在 UIImageView 中展示。
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {

    [picker dismissViewControllerAnimated:NO completion:NULL];

    _imageTaken = nil;
    _imageTaken = [info objectForKey:UIImagePickerControllerEditedImage];
    if(_imageTaken==nil)
    {
        _imageTaken = [info objectForKey:UIImagePickerControllerOriginalImage];
    }
    if(_imageTaken==nil)
    {
        _imageTaken = [info objectForKey:UIImagePickerControllerCropRect];
    }

    [_imageTakenView setContentMode:UIViewContentModeScaleAspectFill];

    if (_selfie) {
        UIImage * flippedImage = [UIImage imageWithCGImage:_imageTaken.CGImage scale:_imageTaken.scale orientation:UIImageOrientationLeftMirrored];
        _imageTaken = flippedImage;
    }

    _imageTakenView.image = _imageTaken;
}

目前一切都很顺利。然后我通过将图片转换为NSData来将其上传到我的数据库。

    _imageData = [[NSData alloc] init];
    _imageData = UIImageJPEGRepresentation(_image, .1);

当我从服务器加载数据并在另一个相同大小的UIImageView中呈现时,我会设置相同的纵横比:

    [_imageViewToShow setContentMode:UIViewContentModeScaleAspectFill];

图片看起来扭曲了(横向压缩)。有任何想法是什么原因造成的?
将UIImage转换为NSData并保存。
_imageData = UIImageJPEGRepresentation(_image, .1);
PFFile *imageFile = [PFFile fileWithName:@"image.png" data:_imageData];
newMessage[@"image"] = imageFile;
问题:

重新下载数据后,UIImage 图像会显得扁平。但是当我在我的数据库中查看该图像时,它看起来很好。不确定为什么会发生这种情况...

之前和之后的图像:

enter image description here

enter image description here


你是否在图像视图上设置了变换?标题提到了它,但示例代码只显示了图像选择器上的变换。 - Austin
@Austin,我正在设置图像选择器上的转换。抱歉。 - Apollo
@Austin 我觉得现在很有可能,因为我正在查看我的服务器上的图像。我该如何旋转它们/你认为为什么高度/宽度会被交换? - Apollo
@Austin 我想你一定是对的。我意识到当我的UIImagePicker返回时,我忽略了包含部分图像处理的内容。你介意看一下吗? - Apollo
你是用[UIImage imageWithData:]来加载图片的,对吧? - Austin
显示剩余6条评论
1个回答

5

上传图片前,请尝试先将图片的方向进行标准化处理。即使元数据丢失,也可以使图片正常工作。

以下是可供使用的类别:

UIImage+OrientationFix.h

@interface UIImage (OrientationFix)

- (UIImage*)imageByNormalizingOrientation;

@end

UIImage+OrientationFix.m

@implementation UIImage (OrientationFix)

- (UIImage*)imageByNormalizingOrientation {
    if (self.imageOrientation == UIImageOrientationUp)
        return self;

    CGSize size = self.size;
    UIGraphicsBeginImageContextWithOptions(size, NO, self.scale);
    [self drawInRect:(CGRect){{0, 0}, size}];
    UIImage* normalizedImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return normalizedImage;
}

@end

您只需调用:

_imageTaken = [flippedImage normalizedImage];

哇,这真的起作用了。你能解释一下这里发生了什么吗?当然,非常感谢你。 - Apollo
1
基本上,图像不仅存储像素,还需要存储有关方向的信息。您创建的UIImage具有UIImageOrientationLeftMirroredUIImageView使用此信息正确显示它。然而,当您转换为JPEG格式时,它们有自己的方式来存储旋转信息。您可以在https://dev59.com/HG435IYBdhLWcg3w7k6b上了解更多详细信息。但是,这个修复程序基本上将方向设置为“UP”,以便没有人在显示时遇到问题。 - Jack
1
太棒了。谢谢Jack。一旦允许,我会授予你赏金。 - Apollo

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