MPMediaItemArtwork返回错误大小的艺术作品

时间:2011-10-05 20:55:44

标签: iphone objective-c ios mpmediaitem

我发现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}并且由于图像大小超过两倍而导致一些内存问题那些预期的。

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

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

2 个答案:

答案 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];