iPhone / Xcode:UIImage和UIImageView无法使用该程序

时间:2011-02-09 03:21:54

标签: 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]];

我做了一些测试,其中我有两个并排的UIImageViews,一个在左边没有保存并在显示之前加载图像(它只是直接显示图像一旦从中拾取照片ImagePicker),右边一个显示保存加载后显示。右边的那个是唯一一个旋转90度CCW;非保存/加载图片正确显示。这只发生在实际的iPhone上。模拟器正确显示两个图像。我花了很多很多时间试图搞清楚,但无济于事。关于可能导致这种情况的任何想法?

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

如果你真的想知道我是如何拉动我的照片的,那么这个方法至少可以解释我正在做的事情(很明显,并不是每个方法都需要这样做,但它提供了洞察力关于我如何编写代码):

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

非常感谢任何建议。而且我确实知道这一点:如果有办法做一些疯狂的事情来得到一些愚蠢的,从未听过的问题,很可能,我会发现它,显然:P

3 个答案:

答案 0 :(得分:5)

确定。我想到了。显然,当您使用PNG表示保存事物而不是JPEG表示时,图像方向信息不会随之保存。因此,每个加载的图像都默认显示方向向上。所以,最简单的方法是:

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

而不是:

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

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

答案 1 :(得分:0)

我假设您正在使用资产库框架来获取图像。如果是这样,您将需要在结果块中获取图像的方向,并操纵UIImage进行调整。我有以下内容:

ALAssetsLibraryAssetForURLResultBlock resultBlock = ^(ALAsset* asset)
{
  ALAssetRepresentation* rep = [asset defaultRepresentation];
  _orientation = rep.orientation;

...

}

旁白:这是一个多么好的名字,是吧?神圣的Moly,Objective-C是否需要命名空间!

答案 2 :(得分:0)

非常感谢...... 这段代码已经工作并为我节省了几个小时的工作量。

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

代替

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