【问题标题】:iPhone/Xcode: UIImage and UIImageView won't get with the programiPhone/Xcode:UIImage 和 UIImageView 不会与程序一起使用
【发布时间】: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


【解决方案1】:

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

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

...

}

旁白:多么棒的类型名称,嗯?天哪,Objective-C 需要命名空间吗!

【讨论】:

  • 嗯,我可能得试试。但是,我没有使用资产库。查看我的编辑以获取有关我所做工作的更多信息。很抱歉造成混乱。
【解决方案2】:

好的。我想到了。显然,当您使用 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 所必需的。希望这对未来的人们有所帮助!

【讨论】:

    【解决方案3】:

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

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

    代替

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多