7

我看到 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 文档建议这应该像我期望的那样工作,而不是它实际上是如何工作的

4

2 回答 2

9

我从 Apple 下载了AddMusic 示例源,它也使用 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-方式

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

UIImage *albumCover = [artwork imageWithSize:CGSizeMake(128.0f, 128.0f)];
UIImage *resizedCover = [albumCover resizedImage: CGSizeMake(128.0f, 128.0f) interpolationQuality: kCGInterpolationLow]; 
于 2011-10-10T14:44:51.683 回答
0

使用 Trevor Harman 的“UIImage+Resize”类别,可以很简单地将 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];
于 2011-10-25T13:56:04.070 回答