如何从 Photolibrary 图像中获取拇指图像?

Posted

技术标签:

【中文标题】如何从 Photolibrary 图像中获取拇指图像?【英文标题】:How to get thumb image from Photolibrary image? 【发布时间】:2018-03-15 17:13:27 【问题描述】:

目前我正在获取内存问题,因为我正在 React Native 的 Flatlist 中加载直接图像。问题是由于达到高分辨率图像内存限制并且应用程序在 iPhone 上崩溃。有什么方法可以获取像图片网址这样的直接拇指网址(例如网址:'assets-library://asset/asset.JPG?id=5BECA80C-33B3-46A0-AE44-CF28A838CECF&ext=JPG',)?

目前我正在使用“React-native-photo-framework”。

【问题讨论】:

你能用链接分享你正在使用的库吗? 它的原生 ios 库。有没有办法读取我们正在获取的原始图像的原生拇指图像? 这个答案对您没有帮助吗?看起来很相似***.com/questions/28887638/… 它为我提供直接图像路径而不是拇指路径 【参考方案1】:

getAssets 采用 prepareForSizeDisplay 属性。这使用PHCachingImageManager 请求指定大小的资产图像。

例子:

RNPhotosFramework.getAssets(
    startIndex: 0,
    endIndex: 100,
    prepareForSizeDisplay: Rect(100,100),
    fetchOptions: 
        sourceTypes: ['userLibrary'],
        sortDescriptors: [
            key: 'creationDate',
            ascending: true,
        ]
    
).then((response) => console.log(response.assets));

当用户点击您的FlatList 中的行时,您就可以获取全尺寸资产。在需要显示之前不要获取全尺寸资源。

【讨论】:

它对我没有帮助。 你觉得什么没用? 其实我想要直接的拇指网址。我认为 iPhone 已经在存储这就是为什么它在 iPhone 库中的加载非常流畅。 来自 iOS 照片文档:为了在处理大量资产时获得更快的性能(例如,在使用缩略图填充集合视图时),PHCachingImageManager 子类添加了批量预加载。我推荐的 API 适合您的用例。 Aaron,我通过使用原生 iOS 模块得到了最终解决方案。实际上 RNPhotosFramework 存在一些问题,如果您设置 prepareForSizeDisplay: Rect(100,100),那么它会冻结应用程序而不会出现任何错误。我尝试了很多解决方案,但最后我创建了原生 iOS 模块并在我的代码中实现了它。【参考方案2】:

对于这个问题,我终于有了自己的解决方案。我已经尝试了所有方法来解决,但我无法解决它。最后我知道新的照片库提供了获取调整大小图像的选项,但这就​​是 react-native-photos-framework 不工作的地方。我的本地经验将帮助我解决我的问题,希望这对您有所帮助。 Here 是详细描述和代码的链接。

让我在这里添加代码 sn-ps。

导入原生图片库

#import <Photos/Photos.h>

CGSize retinaSquare = CGSizeMake(600, 600);

PHImageRequestOptions *cropToSquare = [[PHImageRequestOptions alloc] init];
cropToSquare.resizeMode = PHImageRequestOptionsResizeModeExact;
cropToSquare.deliveryMode = PHImageRequestOptionsDeliveryModeOpportunistic;
[cropToSquare setSynchronous:YES];

NSURL *imageurl = [NSURL URLWithString:@"youimagepath"];

PHFetchResult* asset =[PHAsset fetchAssetsWithALAssetURLs:[NSArray arrayWithObjects:imageurl, nil] options:nil];

[[PHImageManager defaultManager] requestImageForAsset:(PHAsset *)[asset objectAtIndex:0] targetSize:retinaSquare contentMode:PHImageContentModeAspectFit                                                options:cropToSquare                                          resultHandler:^(UIImage *fetchedImage, NSDictionary *info) 

  NSData *imageData = UIImageJPEGRepresentation(fetchedImage,0.65);

  NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
  NSTimeInterval timeStamp = [[NSDate date] timeIntervalSince1970];
  NSString *filePath = [[paths objectAtIndex:0] stringByAppendingPathComponent:[NSString stringWithFormat:@"%0.0f.jpg", timeStamp*1000]];
  NSError *error = nil;
  [imageData writeToFile:filePath options:NSDataWritingAtomic error:&error];
  NSURL* fileUrl = [NSURL fileURLWithPath:filePath];
  if(error)
    fileUrl = imageurl;
  

  NSString *resizedImagePath = [NSString stringWithFormat:@"%@",fileUrl];

];

【讨论】:

此方法会在手机上创建很多新照片,因为我们正在制作应用内图库 您可以添加自己的功能来删除上传到服务器的图像。它需要您自己处理,或者您可以使用图像而不保存在您的文档目录中。 但我只想在应用程序库中制作,我不想将照片上传到服务器 你可以在这里找到演示:github.com/logisticinfotech/react-native-resize-image

以上是关于如何从 Photolibrary 图像中获取拇指图像?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Android 上的 URL 页面获取预览拇指?

如何使用 GD 库从上传的文件中自动创建缩略图

自定义 PhotoLibrary 和 jpeg 压缩

Codeigniter上传库获取拇指文件名

如何显示 Cordova PhotoLibrary 返回的图像?

如何使用拇指从文件夹本地加载图像