从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
答案 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];