Ключ UIImagePickerControllerReferenceURL не появляется до iOS 4.1. Поэтому я полагаю, что в вашем вопросе подразумевается, что можно использовать инфраструктуру AssetsLibrary, которая появилась в iOS только в версии 4.0. В этом случае вы можете использовать следующее:
- (void)imagePickerController:(UIImagePickerController *)picker
didFinishPickingMediaWithInfo:(NSDictionary *)info
{
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
[library assetForURL:[info objectForKey:UIImagePickerControllerReferenceURL]
resultBlock:^(ALAsset *asset)
{
ALAssetRepresentation *representation = [asset defaultRepresentation];
NSLog(@"size of asset in bytes: %d", [representation size]);
unsigned char bytes[4];
[representation getBytes:bytes fromOffset:0 length:4 error:nil];
NSLog(@"first four bytes: %02x (%c) %02x (%c) %02x (%c) %02x (%c)",
bytes[0], bytes[0],
bytes[1], bytes[1],
bytes[2], bytes[2],
bytes[3], bytes[3]);
[library autorelease];
}
failureBlock:^(NSError *error)
{
NSLog(@"couldn't get asset: %@", error);
[library autorelease];
}
];
}
Итак, вы создаете ALAssetsLibrary, просите его найти вам ресурс с указанным URL-адресом (он понимает схему assets-library: // URL), затем, когда вы получаете актив, вы берете его представление по умолчанию и используете его для кормить вас байтами. Они будут фактическими байтами на диске, представление по умолчанию для ресурса из библиотеки является его формой на диске.
Например, выбор произвольного GIF, который я случайно выбрал из изображений Google, из средства выбора изображений, подключенного к делегату с таким методом, дает мне вывод:
2011-03-03 23: 17: 37.451
IPTest [1199: 307] размер актива в
байт: 174960
2011-03-03 23: 17: 37.459
IPTest [1199: 307] первые четыре байта: 47
(G) 49 (I) 46 (F) 38 (8)
Итак, это начало стандартного заголовка GIF. Выбор PNG или JPG дает распознаваемые первые четыре байта заголовков PNG и JPG.
РЕДАКТИРОВАТЬ: чтобы закончить мысль, очевидно, вы можете использовать ALAssetRepresentation, чтобы прочитать все байты, описывающие файл в подходящем malloc'd массиве C, затем использовать NSData + (id) dataWithBytes: length: (или, более вероятно, + dataWithBytesNoCopy: length: freeWhenDone :), чтобы обернуть это в NSData.