我发现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}
并且由于图像大小超过两倍而导致一些内存问题那些预期的。
是否有其他人目睹了这个特殊问题。你是怎么解决的?
苹果文档建议这应该像我期望的那样工作,而不是它实际上是如何
答案 0 :(得分:9)
我从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提交的一个错误,虽然苹果也可能有一个借口,“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];
答案 1 :(得分:0)
使用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];