MPMediaItemArtwork 返回尺寸错误的图稿

Posted

技术标签:

【中文标题】MPMediaItemArtwork 返回尺寸错误的图稿【英文标题】:MPMediaItemArtwork returning wrong sized artwork 【发布时间】:2011-10-05 20:55:43 【问题描述】:

我发现 MPMediaItemArtwork 存在一个一致的问题,即它返回的图稿尺寸与我要求的尺寸不同。

我使用的代码如下

MPMediaItem *representativeItem = [self.representativeItems objectAtIndex:index];
MPMediaItemArtwork *artwork = [representativeItem valueForProperty:MPMediaItemPropertyArtwork];
UIImage *albumCover = [artwork imageWithSize:CGSizeMake(128.0f, 128.0f)];

这按预期工作,除了返回图像的大小始终为320.0f, 320.0f,即使我特别要求128.0f, 128.0f,并且由于图像大小是预期大小的两倍以上,它会导致一些内存问题。

有没有其他人目睹过这个特殊问题。你是怎么解决的?

Apples 文档建议这应该像我期望的那样工作,而不是它实际上是如何工作的

【问题讨论】:

【参考方案1】:

我从 Apple 下载了AddMusic sample source,它也使用 MPMediaItemArtwork 只是为了看看他们是如何处理事情的。

在该项目的 MainViewController.m 文件中,这些行:

// Get the artwork from the current media item, if it has artwork.
MPMediaItemArtwork *artwork = [currentItem valueForProperty: MPMediaItemPropertyArtwork];

// Obtain a UIImage object from the MPMediaItemArtwork object
if (artwork) 
    artworkImage = [artwork imageWithSize: CGSizeMake (30, 30)];

总是以 1.0 的比例返回大小为 55 x 55 的图像。

我会说 MPMediaItemArtwork 不尊重请求的尺寸参数是一个错误,您应该通过 bugreporter.apple.com 提交,尽管 Apple 也可能有一个借口,即“55 x 55”是在 iPad 上显示的最佳尺寸和iPhone。

对于直接调整 UIImage 大小,我建议使用 Trevor Harman 的“UIImage+Resize”方法,该方法可在此处找到:http://vocaro.com/trevor/blog/2009/10/12/resize-a-uiimage-the-right-way

一旦你将他的类别扩展添加到你的项目中,你就可以通过一个简单的调用来实现你想要的节省内存的大小调整:

UIImage *albumCover = [artwork imageWithSize:CGSizeMake(128.0f, 128.0f)];
UIImage *resizedCover = [albumCover resizedImage: CGSizeMake(128.0f, 128.0f) interpolationQuality: kCGInterpolationLow]; 

【讨论】:

我在 Apple 的错误报告系统中将此作为错误提交 - 这很高兴知道,我以为我要疯了,或者我的设备有问题。感谢您提交错误;如果您收到 Apple 的回复,您可以更新这篇文章吗? 我已经在手动调整图像大小,但我使用 Matt Gemmells MGImageUtilities,因为当我尝试上面的链接时,调整后的图像质量非常差,因为它没有考虑 Retina 的比例有能力的设备。 Apple 确实跟进了我,他们让我在 ios 5 下尝试这个。新的结果是我们仍然会看到“55 x 55”,但返回的比例会更符合预期(用于 Retina 显示器)2.0。您是否也有更好的结果? 感谢您的更新。我还没有更新到 5.0,但我仍然担心它没有返回指定的大小,或者这是否是文档尚未更新以反映这一点的期望行为。您能否更新案例,说明他们是否认为这是他们需要更新文档的预期结果(最好更改方法名称)。【参考方案2】:

使用 Trevor Harman 的“UIImage+Resize”类别,可以很简单地将调整大小类别添加到 MPMediaItemArtwork 以获得特定大小和插值质量的调整大小图像:

@interface MPMediaItemArtwork ()
- (UIImage *)resizedImage:(CGSize)newSize
     interpolationQuality:(CGInterpolationQuality)quality;
@end

@implementation MPMediaItemArtwork (Resize)
- (UIImage *)resizedImage:(CGSize)newSize interpolationQuality:(CGInterpolationQuality)quality 
    return [[self imageWithSize:newSize] resizedImage: newSize interpolationQuality: quality];

@end

这样调用就行了

CGSize thumbnailSize = CGSizeMake(128.0, 128.0);
MPMediaItemArtwork *artwork = [myMediaItem valueForProperty:MPMediaItemPropertyArtwork];
UIImage *resizedArtwork = [artwork resizedImage:thumbnailSize interpolationQuality:kCGInterpolationMedium];

【讨论】:

我在 cmets 中提到我已经手动调整图像大小,但我使用 Matt Gemmell 的代码,因为 Trevor Harman 的代码没有考虑 Retina 设备。但是,我的问题是 Apple 的方法没有返回大小符合我要求的图像,这已作为错误提出。

以上是关于MPMediaItemArtwork 返回尺寸错误的图稿的主要内容,如果未能解决你的问题,请参考以下文章

MPNowPlayingInfoCenter:从 URL 设置 MPMediaItemArtwork 的最佳方法是啥?

MPMediaItemArtwork 和 UITableView

矩形图像缩放以适应正方形以与 MPMediaItemArtwork 一起使用

为 MPMediaItemArtwork 声明变量(init() 不可用)

使用 UICollectionView 和 MPMediaItemArtwork 遇到内存泄漏

如何启用 MPMediaItemArtwork 下一个/上一个按钮?