gpt4 book ai didi

ios - 如何从 PHImageManager 获取平方缩略图?

转载 作者:IT王子 更新时间:2023-10-29 08:08:50 34 4
gpt4 key购买 nike

有人知道如何从 PHImageManager 获取平方拇指吗? PHImageContentModeAspectFill 选项无效。

[[PHImageManager defaultManager]
requestImageForAsset:(PHAsset *)_asset
targetSize:CGSizeMake(80, 80)
contentMode:PHImageContentModeAspectFill
options:nil
resultHandler:^(UIImage *result, NSDictionary *info) {
// sadly result is not a squared image
imageView.image = result;
}];

最佳答案

更新:

PHImageManager 检索图像时裁剪图像的错误在 iOS 8.3 中已修复,因此对于该版本的 iOS 及更高版本,我的原始示例有效,如下所示:
似乎错误仍然存​​在,包括 iOS 8.4,我可以用标准的 iPhone 6s 后置摄像头图像重现它们,并采用全尺寸方形裁剪。它们在 iOS 9.0 中得到了适当的修复,即使是 63 兆像素全景的大片也能正常工作。

Apple 定义的方法是通过 CGRect在图像的坐标空间中,原点为 (0,0),最大值为 (1,1)。您在 PHImageRequestOptions 中传递此矩形对象,以及 resizeModePHImageRequestOptionsResizeModeExact ,然后你应该得到一个裁剪的图像。

- (void)showSquareImageForAsset:(PHAsset *)asset
{
NSInteger retinaScale = [UIScreen mainScreen].scale;
CGSize retinaSquare = CGSizeMake(100*retinaScale, 100*retinaScale);

PHImageRequestOptions *cropToSquare = [[PHImageRequestOptions alloc] init];
cropToSquare.resizeMode = PHImageRequestOptionsResizeModeExact;

CGFloat cropSideLength = MIN(asset.pixelWidth, asset.pixelHeight);
CGRect square = CGRectMake(0, 0, cropSideLength, cropSideLength);
CGRect cropRect = CGRectApplyAffineTransform(square,
CGAffineTransformMakeScale(1.0 / asset.pixelWidth,
1.0 / asset.pixelHeight));

cropToSquare.normalizedCropRect = cropRect;

[[PHImageManager defaultManager]
requestImageForAsset:(PHAsset *)asset
targetSize:retinaSquare
contentMode:PHImageContentModeAspectFit
options:cropToSquare
resultHandler:^(UIImage *result, NSDictionary *info) {
self.imageView.image = result;
}];
}

此示例使其 cropRect边长等于 Assets 的宽度和高度中的较小者,然后使用 CGRectApplyAffineTransform 将其转换为图像的坐标空间.您可能需要设置 square 的原点对于 (0,0) 以外的其他东西,您通常希望裁剪正方形沿正在裁剪的图像的轴居中,但我将把它作为练习留给读者。 :-)

原答案:

约翰的回答让我大部分时间都在那里,但使用他的代码,我得到了拉伸(stretch)和压扁的图像。以下是我获得 imageView 的方法显示从 PHImageManager 获取的方形缩略图。

首先,确保 contentMode UIImageView 的属性(property)设置为 ScaleAspectFill .默认为 ScaleToFill ,无法正常显示 PHImageManager 中的方形缩略图,所以无论你是否实例化了 UIImageView,请确保你改变了它。在代码或 Storyboard 中。
//view dimensions are based on points, but we're requesting pixels from PHImageManager
NSInteger retinaMultiplier = [UIScreen mainScreen].scale;
CGSize retinaSquare = CGSizeMake(imageView.bounds.size.width * retinaMultiplier, imageView.bounds.size.height * retinaMultiplier);

[[PHImageManager defaultManager]
requestImageForAsset:(PHAsset *)_asset
targetSize:retinaSquare
contentMode:PHImageContentModeAspectFill
options:nil
resultHandler:^(UIImage *result, NSDictionary *info) {

// The result is not square, but correctly displays as a square using AspectFill
imageView.image = result;
}];

指定 PHImageRequestOptionsResizeModeExact对于 resizeMode不是必需的,因为它不会给您裁剪图像,除非您还提供 normalizedCropRect , 并且不应该在这里使用,因为没有任何好处,并且使用它意味着您不会获得快速返回的缓存图像的好处。
UIImage返回 result将与源的纵横比相同,但可以正确缩放以用于 UIImageView设置为方面填充以显示为正方形,因此如果您只是显示它,这就是要走的路。如果您需要裁剪图像以在应用程序之外打印或导出,这不是您想要的 - 查看 normalizedCropRect 的使用为了那个原因。 (编辑 - 参见下面的示例应该如何工作......)

除此之外还要确保将 UIImageView 的内容模式设置为 UIViewContentModeScaleAspectFill 并且您通过以下 2 行设置 clipsToBounds = YES :
imageView.contentMode=UIViewContentModeScaleAspectFill;
imageView.clipsToBounds=YES;

编辑以添加 normalizedCropRect 用法示例
警告 - 这不起作用,但应该根据 Apple's documentation .

Apple 定义的方法是通过 CGRect在图像的坐标空间中,原点为 (0,0),最大值为 (1,1)。您在 PHImageRequestOptions 中传递此矩形对象,以及 resizeModePHImageRequestOptionsResizeModeExact ,然后你应该得到一个裁剪的图像。问题是你没有,它以原始纵横比和完整图像的形式返回。

我已经验证在图像的坐标空间中正确创建了裁剪矩形,并按照说明使用 PHImageRequestOptionsResizeModeExact ,但结果处理程序仍将传递原始纵横比的图像。这似乎是框架中的一个错误,当它被修复时,下面的代码应该可以工作。
- (void)showSquareImageForAsset:(PHAsset *)asset
{
NSInteger retinaScale = [UIScreen mainScreen].scale;
CGSize retinaSquare = CGSizeMake(100*retinaScale, 100*retinaScale);

PHImageRequestOptions *cropToSquare = [[PHImageRequestOptions alloc] init];
cropToSquare.resizeMode = PHImageRequestOptionsResizeModeExact;

CGFloat cropSideLength = MIN(asset.pixelWidth, asset.pixelHeight);
CGRect square = CGRectMake(0, 0, cropSideLength, cropSideLength);
CGRect cropRect = CGRectApplyAffineTransform(square,
CGAffineTransformMakeScale(1.0 / asset.pixelWidth,
1.0 / asset.pixelHeight));

cropToSquare.normalizedCropRect = cropRect;

[[PHImageManager defaultManager]
requestImageForAsset:(PHAsset *)asset
targetSize:retinaSquare
contentMode:PHImageContentModeAspectFit
options:cropToSquare
resultHandler:^(UIImage *result, NSDictionary *info) {
self.imageView.image = result;
}];
}

我只能建议,如果你有这个问题,你 file a radar与Apple一起要求他们修复它!

关于ios - 如何从 PHImageManager 获取平方缩略图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26023365/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com