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 的错误报告系统中将此作为错误提交 -使用 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() 不可用)