Используя ALAssetsLibrary и ALAsset вынуть изображение как NSData
Я хочу извлечь изображение, используя ALAssetsLibrary и ALAsset непосредственно в форме объекта NSData.
Используя NSURL, я вынимаю изображение следующим образом.
NSURL *referenceURL =newURL;
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
[library assetForURL:referenceURL resultBlock:^(ALAsset *asset)
{
UIImage *copyOfOriginalImage = [UIImage imageWithCGImage:[[asset defaultRepresentation] fullResolutionImage]];
}
Теперь здесь мы берем изображение как UIImage, но мне нужно взять изображение непосредственно как NSData.
Я хочу сделать это, потому что (я прочитал это), как только вы берете изображение в UIImage, мы теряем все детали EXIF изображения.
Вот почему я хочу извлечь изображение непосредственно как NSData, вместо того, чтобы делать это
NSData *webUploadData=UIImageJPEGRepresentation(copyOfOriginalImage, 0.5);
Этот шаг заставляет меня потерять все детали EXIF.
Пожалуйста помоги.
3 ответа
Решение
ALAssetsLibrary *assetLibrary=[[ALAssetsLibrary alloc] init];
[assetLibrary assetForURL:[[self.imagedata objectAtIndex:i] resultBlock:^(ALAsset *asset)
{
ALAssetRepresentation *rep = [asset defaultRepresentation];
Byte *buffer = (Byte*)malloc(rep.size);
NSUInteger buffered = [rep getBytes:buffer fromOffset:0.0 length:rep.size error:nil];
NSData *data = [NSData dataWithBytesNoCopy:buffer length:buffered freeWhenDone:YES];//this is NSData may be what you want
[data writeToFile:photoFile atomically:YES];//you can save image later
}
failureBlock:^(NSError *err) {
NSLog(@"Error: %@",[err localizedDescription]);
}];
Используя этот код:
+ (BOOL)exportDataToURL:(NSString *)filePath error:(NSError **)error andAsset:(ALAsset *)asset
{
[[NSFileManager defaultManager] createFileAtPath:filePath contents:nil attributes:nil];
NSFileHandle *handle = [NSFileHandle fileHandleForWritingAtPath:filePath];
if (!handle)
return NO;
static const NSUInteger BufferSize = 1024 * 1024;
ALAssetRepresentation *rep = [asset defaultRepresentation];
uint8_t *buffer = calloc(BufferSize, sizeof(*buffer));
NSUInteger offset = 0, bytesRead = 0;
do {
@try {
bytesRead = [rep getBytes:buffer fromOffset:offset length:BufferSize error:error];
[handle writeData:[NSData dataWithBytesNoCopy:buffer length:bytesRead freeWhenDone:NO]];
offset += bytesRead;
} @catch(NSException *exception) {
free(buffer);
return NO;
}
} while (bytesRead > 0);
free(buffer);
return YES;
}
UIImage * selImage = [UIImage imageWithCGImage:[asset thumbnail]];
NSData *baseImage=UIImagePNGRepresentation(selImage);