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}も、画像が予想されるサイズの 2 倍を超えているためにメモリの問題が発生していることを除きます。

この特定の問題を目撃した人はいますか。どのように解決しましたか?

Apples docs は、これが実際の方法ではなく、期待どおりに機能することを示唆しています

4

2 に答える 2

9

Apple からAddMusic サンプル ソースをダウンロードしました。これも MPMediaItemArtwork を使用しており、Apple がどのように処理しているかを確認するためだけに使用されています。

そのプロジェクトの 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)];
}

サイズ 55 x 55、スケール 1.0 の画像を常に返します。

要求されたサイズ パラメータを尊重しない 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」カテゴリを使用すると、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 に答える