В конечном итоге я пытаюсь преобразовать массив фотографий, которые находятся в словаре в форме url rep, в base64 для отправки по json.Перейдите из изображения url rep из библиотеки ресурсов в base64
Вот код словаря и журнал его:
NSDictionary *dict = [self.form dictionaryWithValuesForKeys:keys];
NSLog(@"dict::%@",dict);
NSLog:
dict::{
boardLodgingFurnished = "<null>";
caption = "<null>";
cars = "";
photos = (
{
caption = "";
urlRep = "assets-library://asset/asset.JPG?id=CE8A426B-3B59-4172-8761-CC477F3BB3EE&ext=JPG";
},
{
caption = "";
urlRep = "assets-library://asset/asset.JPG?id=F4B68A42-1CA0-4880-9FB5-177CB091A28C&ext=JPG";
}
);
yearsAtLocation = "";
yearsInTheBusiness = "";
}
Так что для каждой фотографии в словаре Я хотел бы взять urlRep и преобразовать его в base64 string и замените urlRep на него в словаре.
Я имею право now..not уверен, если я иду в правильном направлении:
for (id imageURL in [dict objectForKey:@"photos"])
{
ALAssetsLibrary *library = [ALAssetsLibrary new];
ALAsset *ourAsset = [self assetForURL:imageURL withLibrary:library];
/* Check out ALAssets */
NSLog(@"%@", ourAsset);
ALAssetRepresentation *representation = [ourAsset defaultRepresentation];
CGImageRef imageRef = [representation fullResolutionImage];
//TODO: Deal with JPG or PNG
NSData *imageData = UIImageJPEGRepresentation([UIImage imageWithCGImage:imageRef], 0.1);
NSLog(@"imagedata??%@", [imageData base64EncodedString]);
//need to know how to add this back to dict
}
ниже метод вызывается из выше, но падает на время цикла с
-[__NSDictionaryI scheme]: unrecognized selector sent to instance 0x166dd090
2014-01-03 10:57:27.361 Inspection App[2728:60b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSDictionaryI scheme]: unrecognized selector sent to instance 0x166dd090'
метод
- (ALAsset *)assetForURL:(NSURL *)url withLibrary:(ALAssetsLibrary *)assetsLibrary {
__block ALAsset *result = nil;
__block NSError *assetError = nil;
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
[assetsLibrary assetForURL:url resultBlock:^(ALAsset *asset) {
result = asset;
dispatch_semaphore_signal(sema);
} failureBlock:^(NSError *error) {
assetError = error;
dispatch_semaphore_signal(sema);
}];
if ([NSThread isMainThread]) {
while (!result && !assetError) {
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
}
}
else {
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
}
return result;
}
редактировать:
if (photoUrls.count) {
for (id photos in photoUrls){
NSString *urlString = photos;
[self base64ImageAtUrlString:urlString result:^(NSString *base64) {
NSLog(@"imagedata??%@", base64);
}];
}
}
else {
NSLog(@"where are my urls?");
}
NSMutableDictionary *jsonWithPhotos = [dict mutableCopy];
[jsonWithPhotos setObject:convertedImages forKey:@"photo64"];
NSLog(@"jjson photos::%@", jsonWithPhotos);
обновленного метод
- (void)base64ImageAtUrlString:(NSString *)urlString result:(void (^)(NSString *))completion {
NSURL *url = [NSURL URLWithString:urlString];
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
[library assetForURL:url resultBlock:^(ALAsset *asset) {
// borrowing your code, here... didn't check it....
ALAssetRepresentation *representation = [asset defaultRepresentation];
CGImageRef imageRef = [representation fullResolutionImage];
//TODO: Deal with JPG or PNG
NSData *imageData = UIImageJPEGRepresentation([UIImage imageWithCGImage:imageRef], 0.1);
NSString *base64 = [imageData base64EncodedString];
completion(base64);
[convertedImages addObject:base64];
// NSLog(@"converted::%@",convertedImages);
} failureBlock:^(NSError *error) {
NSLog(@"that didn't work %@", error);
}];
}
Когда я войти jsonWithPhotos объект photo64 просто пустой массив
Вы действительно поняли, что данные изображения могут быть «большими» и что для его кодирования в base64 потребуется буфер данных, который на 25% больше изображения. И это умноженное на количество изображений, безусловно, вызовет давление в памяти и в конечном итоге приведет к сбою. – CouchDeveloper
, так как вы предлагаете отправлять изображения на сервер? – BluGeni
Если вы хотите «обрабатывать» изображения (скажем, кодировку base64), я бы рекомендовал, чтобы в памяти в настоящее время хранилось только ограниченное количество изображений, возможно, только * one *. Вы можете выполнить это с помощью очереди (очереди отправки или NSOperationQueue), которая одновременно выполняет определенное количество задач. Вы можете даже поставить в очередь все задачи сразу, если вы ссылаетесь только на изображение с URL-адресом. При отправке данных на сервер вы можете создать резервную копию данных в файле и использовать NSInputStream и инициализировать запрос через свойство HTTPBodyStream. – CouchDeveloper