如何在ios中从UIImage设置图像

Posted

技术标签:

【中文标题】如何在ios中从UIImage设置图像【英文标题】:how to set image from UIImage in ios 【发布时间】:2014-12-29 13:13:43 【问题描述】:

我正在从联系人中获取图像并将其存储为:

NSData *contactImageData = (__bridge NSData *)ABPersonCopyImageDataWithFormat(person, kABPersonImageFormatThumbnail);
UIImage  *img = [UIImage imageWithData:contactImageData];
NSLog(@"%@",img); //returns like '<UIImage: 0x7fc740460260>'

[contactInfoDict setObject:img forKey:@"image"]; //contactInfoDict is a NSDictionary

现在我再次将图像设置为:

UIImage *image = [UIImage imageWithCGImage:(__bridge CGImageRef)([contactInfoDict objectForKey:@"image"])];
cell.profileImg.image = image;

但是什么也没发生。根本没有图像。我做错了什么?

更新

我也试过了:

NSData *contactImageData = (__bridge NSData *)ABPersonCopyImageDataWithFormat(person, kABPersonImageFormatThumbnail);
[contactInfoDict setObject:contactImageData forKey:@"image"];

像这样获取它:

 NSString *str = [contactInfoDict objectForKey:@"image"];
 NSData* data=[str dataUsingEncoding:NSUTF8StringEncoding];
 UIImage *image = [UIImage imageWithData:data];
 cell.profileImg.image = image;

但不工作。将 NSData 设置为图像后图像返回 nil。

【问题讨论】:

尝试调试。 img 是一个有效的对象吗?是imagecellcell.profileImg 尝试使用类型转换UIImage *image = (UIImage *)[contactInfoDict objectForKey:@"image"];您也可以通过 img = [UIImage imageWithData:(NSData *)ABPersonCopyImageData(person)]; 获取直接图像 是的,所有都是有效的对象! 你可以试试我的答案并告诉我吗? 嗨,我已经更新了我的答案,你可以检查一下.. 【参考方案1】:

首先check personimage。现在使用ABPersonCopyImageDataWithFormat

if (ABPersonHasImageData(yourPersonObject)) 

   //person has image
   //ARC need to take ownership of the Core Foundation object . Use CFBridgingRelease
   //Your mistake is here where i have changed
   NSData *imgData = CFBridgingRelease(ABPersonCopyImageDataWithFormat(yourPersonObject, kABPersonImageFormatThumbnail));

   if(imgData)
   
      UIImage  *img = [UIImage imageWithData:imgData];
      if(img)
      
         [contactInfoDict setObject:img forKey:@"image"];
      
   

else

   NSLog(@"no image");

【讨论】:

好的,那么我如何获取图像并将其设置为视图?? 彻底检查我的答案。 好的,我将 imgData 保存到数据库中,然后像这样使用它:NSString *str = [contactInfoDict objectForKey:@"image"]; NSData* data=[str dataUsingEncoding:NSUTF8StringEncoding]; UIImage *image = [UIImage imageWithData:data]; cell.profileImg.image = image; 但是在将 NSData 设置为图像后,图像返回 nil。而 NSString 和 NSData 不为空。 第二个选项你能帮忙吗?我刚刚更新了问题。 使用***.com/a/5308188/1106035将图像保存在数据库中,并将在NSData中获取图像,可以像这样使用 UIImage *img = [UIImage imageWithData:imgDataObtainedFromDataBase];【参考方案2】:

您可以使用此方法获取图像:

 - (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker
                             didSelectPerson:(ABRecordRef)person
    
    if (ABPersonHasImageData(person)) 
        NSData *contactImageData = (__bridge NSData *)ABPersonCopyImageDataWithFormat(person, kABPersonImageFormatThumbnail);

      UIImage *image=[UIImage imageWithData:contactImageData];
    

    [_addressBookController dismissViewControllerAnimated:YES completion:nil];


【讨论】:

【参考方案3】:

您正在为键设置 UIImage。所以我认为你不需要这段代码:

UIImage *image = [UIImage imageWithCGImage:(__bridge CGImageRef)([contactInfoDict objectForKey:@"image"])];
cell.profileImg.image = image;

只是

UIImage *image = (UIImage*)[contactInfoDict objectForKey:@"image"];
cell.profileImg.image = image;

【讨论】:

【参考方案4】:

试试这个。

NSData *imagedata = (__bridge NSData *)(ABPersonCopyImageData(person));
UIImage  *img;
if(imagedata !=nil)
img = [UIImage imageWithData:contactImageData];
else  // assign it a temporary image.
img = [UIImage imageNamed:@"TempImage"];

[contactInfoDict setObject:img forKey:@"image"];

之后:

UIImage *image = [UIImage imageWithCGImage:(__bridge CGImageRef)([contactInfoDict objectForKey:@"image"])];
    cell.profileImg.image = image;

【讨论】:

【参考方案5】:

好的,所以你在这里从CGImage 创建一个UIImage 并将其存储在NSDictionary 中:

NSData *contactImageData = (__bridge NSData *)ABPersonCopyImageDataWithFormat(person, kABPersonImageFormatThumbnail);
UIImage  *img = [UIImage imageWithData:contactImageData];
NSLog(@"%@",img); //returns like '<UIImage: 0x7fc740460260>'
[contactInfoDict setObject:img forKey:@"image"];

但在这里你将UIImage 对象视为CGImage(请记住,你已经创建了UIImage

UIImage *image = [UIImage imageWithCGImage:(__bridge CGImageRef)([contactInfoDict objectForKey:@"image"])];
cell.profileImg.image = image;

试试这个:

cell.profileImg.image = [contactInfoDict objectForKey:@"image"];

【讨论】:

它在哪一行崩溃?您可以在创建contactInfoDict 对象的位置发布代码吗?是NSMutableDictionary吗? cell.profileImg.image = [contactInfoDict objectForKey:@"image"];这个。 控制台说什么? -[__NSCFString size]: unrecognized selector sent to instance 0x7fecf1fbf340 *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFString size]: unrecognized selector sent to instance 0x7fecf1fbf340' contactInfoDictstrong 属性吗?【参考方案6】:

首先将contactInfoDict 当作NSMutableDictionary 然后试试下面的代码。

NSData *contactImageData = (__bridge NSData *)ABPersonCopyImageDataWithFormat(person, kABPersonImageFormatThumbnail);
[contactInfoDict setObject:[UIImage imageWithData:contactImageData]; forKey:@"image"]; 

// As its an Mutable dictionary, it will save the Value for sure.

再次获取图像

cell.profileImg.image = ( UIImage *) [contactInfoDict objectForKey:@"image"];

更新

直接通过记录id从通讯录中获取图片

ABAddressBookRef addressBook = ABAddressBookCreate( ); 
NSNumber *recordId = [NSNumber numberWithInteger:[record_str integerValue]];
ABRecordRef person = ABAddressBookGetPersonWithRecordID(addressBook,recordId.integerValue);
NSData *contactImageData = (__bridge NSData *)ABPersonCopyImageDataWithFormat(person, kABPersonImageFormatThumbnail);
cell.profileImg.image = [UIImage imageWithData:contactImageData];

【讨论】:

你服用了 NSMutableDictionary 吗?崩溃日志显示什么?你可以发布它的截图吗?它在哪一行崩溃? cell.profileImg.image = ( UIImage *) [contactInfoDict objectForKey:@"image"]; -[__NSCFString size]: unrecognized selector sent to instance 0x7fecf1fbf340 *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFString size]: unrecognized selector sent to instance 0x7fecf1fbf340' Prasad HotaSiba:您能帮忙介绍第二个选项吗?我刚刚更新了问题。 您将 ContactDict 存储到 Sqlite?您应该在问题中提及这一点。从日志中,您似乎得到了导致其崩溃的字符串。 为什么要将图像保存到 Sqlite? 您只需保存记录 ID 并在需要时通过记录 ID 从地址簿获取图像。

以上是关于如何在ios中从UIImage设置图像的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中从文件夹中获取 UIImage 数组?

在ios中从uitableviewcell拖放到uiimage视图

如何在 iOS 7 的 UITextField 中添加带有缩进的图像 UIImage?

iOS13分享表:分享UIImage时如何设置预览缩略图

如何在 swift 中从 nsimage 创建灰度图像?

如何在uiscrollview中双击缩放和两个手指缩放uiimage