2010-01-18 1 views

ответ

42

Вы можете сделать это так ....

NSData *imgData = (NSData *)ABPersonCopyImageData(person); 

UIImage *img = [UIImage imageWithData:imgData]; 

где person имеет тип ABRecordRef. Теперь, когда CFData и NSData являются бесплатными мостами, вы можете просто набрать листинг CFData в NSData и получить изображение

Надеюсь, это поможет.

+0

просто обратите внимание, что "imgaeWithData: imgData" в последней строке фрагмента кода следует читать "imageWithData: imgData". Я исправил его –

+0

Обратите внимание, что это может быть не изображение, которое пользователи ожидают, так как это не обрезанная версия изображения. См. [Ответ ChangUZ] (http://stackoverflow.com/a/6953492/784318) – Besi

+0

@Besi Но без упоминания какого-либо формата изображения выгодно, поскольку при заполнении изображений в ячейках табличного вида мы используем представление изображения в виде аксессуаров , потому что он автоматически изменяет размер изображения и устанавливает каждое изображение в уникальном формате (одинаковые размеры) :) –

12
(NSData*)ABPersonCopyImageDataWithFormat([targetPeople objectAtIndex:index], kABPersonImageFormatThumbnail) 

Это быстрее, так как оно возвращает миниатюру.

+0

+1, потому что в дополнение к миниатюре может быть, что изображение контакта было обрезано, поэтому подход ChangUZ возвратит то же изображение, что показано в адресной книге. – Besi

+2

Но этот метод доступен из iOS 4.1. – rowwingman

0

Слегка обновилась код:

UIImage *image = nil; 

@try 
{ 
    CFDataRef cfImage = ABPersonCopyImageData(person); 
    // or CFDataRef cfImage = ABPersonCopyImageDataWithFormat(person, kABPersonImageFormatThumbnail); 
    if (cfImage) 
    { 
     image = [UIImage imageWithData:(__bridge NSData*)cfImage]; 
     CFRelease(cfImage); 
    } 
} 
@catch (NSException *exception) 
{ 
    //... 
}