当用户对iOS上内置的Photos.app中的照片进行一些更改(裁剪,消除红眼......等)时,更改不会应用于fullResolutionImage相应的返回ALAssetRepresentation.
但是,更改将应用于thumbnail和fullScreenImage返回的ALAssetRepresentation.此外,有关应用更改的信息可以ALAssetRepresentation通过密钥在元数据字典中找到@"AdjustmentXMP".
我想将这些更改应用于fullResolutionImage自己以保持一致性.我发现,在iOS6的+ CIFilter的filterArrayFromSerializedXMP: inputImageExtent:error:可以在此XMP元数据转换成数组CIFilter的:
ALAssetRepresentation *rep;
NSString *xmpString = rep.metadata[@"AdjustmentXMP"];
NSData *xmpData = [xmpString dataUsingEncoding:NSUTF8StringEncoding];
CIImage *image = [CIImage imageWithCGImage:rep.fullResolutionImage];
NSError *error = nil;
NSArray *filterArray = [CIFilter filterArrayFromSerializedXMP:xmpData
inputImageExtent:image.extent
error:&error];
if (error) {
NSLog(@"Error during CIFilter creation: %@", [error localizedDescription]);
}
CIContext *context = [CIContext contextWithOptions:nil];
for (CIFilter *filter in filterArray) {
[filter setValue:image …Run Code Online (Sandbox Code Playgroud) 我正在将我们的应用程序转换为使用iOS8的Photos Framework,ALAsset框架显然是iOS8下的二等公民.
我遇到的一个问题是我们的架构真的需要一个代表媒体在"磁盘"上的位置的NSURL.我们使用它将媒体上传到我们的服务器以进行进一步处理.
使用ALAsset很容易:
ALAssetRepresentation *rep = [asset defaultRepresentation];
self.originalVideo = rep.url;
Run Code Online (Sandbox Code Playgroud)
但我只是没有在PHAsset中看到这种能力.我猜我可以打电话:
imageManager.requestImageDataForAsset
Run Code Online (Sandbox Code Playgroud)
然后把它写到文件系统中的临时点,但这看起来非常重量级和浪费,更不用说潜在的慢.
有没有办法得到这个,或者我将重构更多的我的应用程序只使用NSURLs的iOS7和其他一些方法的iOS8?
我正在尝试访问用户使用突发模式拍摄的iOS资源库中的照片.我正在尝试使用ALAssetsLibrary和过滤照片:
- (void)findBurstModePhotos
{
ALAssetsFilter *allPhotos = [ALAssetsFilter allPhotos];
ALAssetsLibrary *assetLibrary = [[ALAssetsLibrary alloc] init];
[assetLibrary enumerateGroupsWithTypes:ALAssetsGroupAll
usingBlock:^(ALAssetsGroup *group,
BOOL *stop) {
[group setAssetsFilter:allPhotos];
NSLog(@"Group: %@",
[group valueForProperty:
ALAssetsGroupPropertyName]);
if ([group numberOfAssets] > 0) {
[self evaluateGroup:group];
}
}
failureBlock:^(NSError *error) {
NSLog(@"Failure enumerating groups: %@",
[error localizedDescription]);
}];
}
- (void)evaluateGroup:(ALAssetsGroup *)group
{
[group enumerateAssetsUsingBlock:^(ALAsset *result,
NSUInteger index,
BOOL *stop) {
NSLog(@"Photo date: %@", [result valueForProperty:ALAssetPropertyDate]);
}];
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,这会将Burst Mode照片作为单张照片返回.是否有支持的方式单独获取Burst Mode照片?我想从单个突发模式会话中获取每张照片.
我期待在更换ALAssetsLibrary与Photos框架在我的应用程序.
我可以很好地检索照片,集合和资源(甚至可以将它们写回来),但是看不到任何地方可以访问照片的元数据({Exif},{TIFF},{GPS}等字典,等等...).
ALAssetsLibrary有办法.UIImagePickerController有办法.Photos也必须有办法.
我看到它PHAsset有一个location属性可以用于GPS词典,但我希望访问所有的元数据,包括面部,方向,曝光,ISO和吨更多.
目前苹果处于测试阶段2.也许还有更多的API需要推出?
UPDATE
没有官方的方法只使用Photos API来做到这一点.
但是,您可以在下载图像数据后读取元数据.有几个方法来做到这一点使用两种PHImageManager或PHContentEditingInput.
该PHContentEditingInput方法需要较少的代码,不需要您导入ImageIO.我把它包装在PHAsset类别中.
此代码在iOS 7中运行良好,但在iOS 8.1中,位于"我的照片流"专辑中的所有资源都不在结果块中.(未调用failureBlock.)常规专辑和共享专辑可以正常工作.
我尝试了接受的答案:尝试从assetForURL内部分配__block ALAsset时出错:resultBlock:
也就是说,我持有对ALAssetsLibrary对象的引用,监听ALAssetsLibraryChangedNotification事件(这不会发生顺便,但是很好.)我确保我的应用程序有权访问照片,我在wi-fi上,我在tableView中看到照片的缩略图很好.只是当我尝试加载它们时,assetForURL:它们总是为零.
// example URL: assets-library://asset/asset.JPG?id=1ECB69B9-DC7A-45A7-B135-F43317D3412C&ext=JPG
[self.library assetForURL:[NSURL URLWithString:url] resultBlock:^(ALAsset *asset) {
NSLog(@"Asset: %@", asset); // nil :(
} failureBlock:^(NSError *error) {
NSLog(@"Failure, wahhh!");
}];
Run Code Online (Sandbox Code Playgroud)
还有其他人看到这个问题吗?
我想等待这个代码继续执行之前继续但是因为这些块被异步调用我不知道该怎么做???
NSURL *asseturl;
NSMutableArray *tmpListAsset = [[NSMutableArray alloc] init];
ALAssetsLibrary *library = [[[ALAssetsLibrary alloc] init] autorelease];
NSMutableArray *objectsToRemove = [[NSMutableArray alloc] init];
for (NSDictionary *dico in assetsList) {
asseturl = [NSURL URLWithString:[dico objectForKey:@"assetUrl"]];
NSLog(@"asset url %@", asseturl);
// Try to load asset at mediaURL
[library assetForURL:asseturl resultBlock:^(ALAsset *asset) {
// If asset doesn't exists
if (!asset){
[objectsToRemove addObject:dico];
}else{
[tmpListAsset addObject:[asseturl absoluteString]];
NSLog(@"tmpListAsset : %@", tmpListAsset);
}
} failureBlock:^(NSError *error) {
// Type your code here for failure (when user …Run Code Online (Sandbox Code Playgroud) 我正在尝试在iPhone的照片库中创建自定义相册,然后保存我用相机拍摄的照片,或从手机相机胶卷中选择到该自定义相册的照片.我可以成功创建相册,但照片没有保存在那里,而是他们被保存到模拟器保存的照片专辑...我不知道如何告诉UIImageWriteToSavedPhotosAlbum保存到我刚创建的新专辑addAssetsGroupAlbumWithName. ..
这是我到目前为止的代码 - 我已经删除了几个部分以保持我的代码示例简短...
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType];
if([mediaType isEqualToString:(__bridge NSString *)kUTTypeImage])
{
// pull GPS information from photos metadata using ALAssetsLibrary
void (^ALAssetsLibraryAssetForURLResultBlock)(ALAsset *) = ^(ALAsset *asset)
{
// code snipped out
};
NSURL *assetURL = [info objectForKey:UIImagePickerControllerReferenceURL];
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
[library assetForURL:assetURL
resultBlock:ALAssetsLibraryAssetForURLResultBlock
failureBlock:^(NSError *error)
{
// code snipped out
}];
// getimage from imagePicker and resize it to the max size of …Run Code Online (Sandbox Code Playgroud) iphone objective-c uiimagepickercontroller uiimage alassetslibrary
我正在尝试本地化应用程序的info.plist文件中定义的NSPhotoLibraryUsageDescription键(此处引用).
当应用程序首次要求访问您的相机胶卷时,此键可让您提供自定义消息.我正在使用ALAssetsLibrary来枚举资产组(它会触发弹出的访问请求消息).
到目前为止,我的谷歌搜索没有回答我如何实现这一目标.
我想避免本地化整个info.plist文件,因为它包含更多非依赖于区域设置的内容.
任何人已经解决了这个或有提示如何进行?
iOS不再要求用户提供照片库权限.即使我从设备中删除了应用程序.这也发生在模拟器上.
switch ([ALAssetsLibrary authorizationStatus])
{
case ALAuthorizationStatusAuthorized:
RPMLog(@"authorized");
break;
case ALAuthorizationStatusDenied:
RPMLog(@"denied");
break;
case ALAuthorizationStatusNotDetermined:
RPMLog(@"not determined");
break;
case ALAuthorizationStatusRestricted:
RPMLog(@"restricted");
break;
}
Run Code Online (Sandbox Code Playgroud)
我第一次安装应用程序时已经获得授权.在此之前,没有其他事件或屏幕要求照片触发用户提示.
然后我在SavedPhotos中请求numberOfAssets并在没有访问提示的情况下获取它:
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
[library enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
if (!group) return;
UIActionSheet *actionSheet = nil;
if (([group numberOfAssets] > 0))
{
actionSheet = [[UIActionSheet alloc] initWithTitle:nil delegate:self cancelButtonTitle:NSLocalizedString(@"Cancel", nil) destructiveButtonTitle:nil otherButtonTitles:NSLocalizedString(@"Take new photo", nil), NSLocalizedString(@"Use last photo taken", nil), NSLocalizedString(@"Choose existing", nil), nil];
}
else
{
actionSheet = …Run Code Online (Sandbox Code Playgroud) 我在iOS 8上遇到了一个问题,资产库框架似乎是iOS 8中的一个错误.如果我创建一个名为"MyMedia"的专辑然后将其删除,那么当我再次尝试创建专辑时,这个大块下面的代码返回'nil'表示专辑'MyMedia'存在,即使它没有,因为我使用'Photos'应用删除了它.
__block ALAssetsGroup *myGroup = nil;
__block BOOL addAssetDone = false;
NSString *albumName = @"MyMedia";
[assetsLib addAssetsGroupAlbumWithName:albumName
resultBlock:^(ALAssetsGroup *group) {
myGroup = group;
addAssetDone = true;
} failureBlock:^(NSError *error) {
NSLog( @"failed to create album: %@", albumName);
addAssetDone = true;
}];
while (!addAssetDone) {
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.05f]];
}
return myGroup; // returns nil if group has previously been created and then deleted
Run Code Online (Sandbox Code Playgroud)
创建全新专辑"MyMedia2"时,此方法也适用.有没有其他人遇到此问题,并知道解决方法或解决方案?是唯一能够转移到新"照片"框架的解决方案,还是我在这里做错了什么?请注意,此代码始终适用于iOS7.X
实际上,重现此问题的步骤如下 - > 1.卸载拍摄照片的应用程序并将其保存到自定义相册2.在iOS照片下删除已保存照片的自定义相册3.安装应用程序4.如果您使用不创建它们的应用程序拍摄照片或录制视频或存储它们.如果您在iOS相册下查看,则自定义相册不存在,并且不存在使用该应用拍摄的所有照片/视频.
alassetslibrary ×10
ios ×5
iphone ×4
objective-c ×4
alasset ×3
ios8 ×3
ios6 ×2
cifilter ×1
ciimage ×1
ios7 ×1
ios8.1 ×1
phasset ×1
uiimage ×1
uiimageview ×1
xcode ×1