【发布时间】:2011-06-23 21:11:07
【问题描述】:
在从 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
【问题讨论】:
-
与您的问题无关:您在这里泄漏数据是因为您在返回后释放它(因此该行永远不会运行)。如果您使用保留调用(alloc、retain 或 new)创建它,则应在返回之前自动释放它。
-
所以即使我释放它,我仍然可以从中读取数据?我不知道。我会改变的。谢谢!
-
autorelease 是要求 AutoreleasePool 在池耗尽时发送 -release 的请求。您不应该从已发布的内容中读取数据。您一直从自动发布的内容中读取数据。
标签: iphone xcode uiimageview uiimage rotation