iPhone/Xcode : UIImage and UIImageView won't get with the program

标签 iphone xcode uiimageview uiimage rotation

从 iPhone 照片库中选取图像后,我尝试在 iPhone 文档目录中保存和加载 UIImage。它可以这样做,但由于某种原因,当我加载图像时,它会逆时针旋转 90 度。这是我的 saveImage 和 loadImage 方法:

保存图像:

- (void)saveImage: (UIImage*)image{
if (image != nil)
{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 
                                                         NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString* path = [documentsDirectory stringByAppendingPathComponent: 
                      [NSString stringWithString: @"lePhoto.png"] ];
    //NSData* data = UIImagePNGRepresentation(image);
    //[data writeToFile:path atomically:YES];
    [UIImagePNGRepresentation(image) writeToFile:path atomically:YES];
    }
}

加载图片:

- (NSData*)loadImage{

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 
                                                         NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString* path = [documentsDirectory stringByAppendingPathComponent: 
                  [NSString stringWithString: @"lePhoto.png"] ];
NSData *data = [[NSData alloc] initWithContentsOfFile:path];


//UIImage *image = [[UIImage alloc] initWithData:data];   //my second try
//UIImage* image = [UIImage imageWithContentsOfFile:path];   //first try
//return image;
return data;
[data release];
}

我现在正在加载这样的图像,看看它是否会出于某种疯狂的原因解决我的问题(显然没有):

UIImage* theImage = [[UIImage alloc] initWithData:[self loadImage]];

我做了一些测试,我有两个并排的 UIImageView,左侧的一个在显示前不会保存和加载图像(一旦从图像中选取照片,它就会直接显示图像) ImagePicker),右侧的一个在保存加载发生后显示。右边的是唯一一个逆时针旋转90度的;非保存/加载图片显示正确。这只发生在实际的 iPhone 上。模拟器正确显示两个图像。我花了很多很多时间试图弄清楚,但无济于事。关于可能导致此问题的任何想法?

编辑:还应该知道,图像总是说它是朝上的,即使它显然不是朝上的!它仅在所有代码运行后才会轮换。我尝试在代码之间进行强制重绘,看看是否会改变事情,但事实并非如此(尽管我什至可能做错了。谁知道呢)。 此外,它不会自动旋转从 iPhone 截图的照片。仅相机拍摄的照片。 [我还没有尝试过下载照片。]这是最奇怪的事情......

如果你想知道我到底是如何绘制图片的,这里的方法至少可以阐明我正在做的事情(显然,这并不是执行此功能所需的所有方法,但它提供了洞察力)关于我如何编写代码):

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { 
theimageView.image = [info objectForKey:@"UIImagePickerControllerOriginalImage"]; 
[self saveImage:[info objectForKey:@"UIImagePickerControllerOriginalImage"]]; 
[picker dismissModalViewControllerAnimated:YES]; 
}

非常感谢任何建议。我确实知道这一点:如果有一种方法可以做一些疯狂的事情来解决一些愚蠢的、从未听说过的问题,那么很可能,我会找到它,显然:P

最佳答案

好的。我想到了。显然,当您使用 PNG 表示形式而不是 JPEG 表示形式保存内容时,图像方向信息不会随之保存。因此,加载的每个图像将默认显示方向向上。因此,最简单的方法是这样做:

NSData* data = UIImageJPEGRepresentation(image,0.0);
[data writeToFile:path atomically:YES];

而不是这个:

[UIImagePNGRepresentation(image) writeToFile:path atomically:YES];

当然,将所有图片名称从 .png 更改为 .jpg。上面代码的0.0部分是控制Alpha级别,这是jpeg所需要的。希望这对将来的人有帮助!

关于iPhone/Xcode : UIImage and UIImageView won't get with the program,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4940992/

相关文章:

iphone - 在滑动手势 UITableView 上获取单元格索引路径

iphone - UIImageWriteToSavedPhotosAlbum 未在左下角显示缩略图

Xcode 7.1 - Storyboard中的原型(prototype)单元格未显示

iphone - 将触摸传递给下一个响应者或其他 subview iOS

iphone - 如何在 IndexPath 处使用 reloadRows 更新行

ios - 如何从控制中心 - 音乐中删除应用程序名称?

iphone - 不完整的实现 xcode buttons to disable buttons

ios - 如何让应用程序知道它是否在纯 Swift 项目中运行单元测试?

iphone - 如何模糊 CGI​​mage 或 UIImageView

ios - UIImageView 拖放到另一个上