MPMediaItemArtwork возвращает произведение неправильного размера - PullRequest
7 голосов
/ 06 октября 2011

Я вижу постоянную проблему с 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}, и это вызывает некоторые проблемы с памятью из-за того, что изображения более чем в два раза превышают ожидаемые.

Кто-нибудь еще был свидетелем этой конкретной проблемы? Как вы решили это?

Документы Apple предполагают, что это должно работать так, как я ожидаю, а не так, как на самом деле

Ответы [ 2 ]

9 голосов
/ 10 октября 2011

Я скачал образец AddMusic от Apple, который также использует 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)];
}

всегда возвращают изображение размером 55 x 55 в масштабе 1,0.

Я бы сказал, что MPMediaItemArtwork, не соблюдающий запрошенные параметры размера, является ошибкой, которую вы должны отправить через bugreporter.apple.com, хотя у Apple также может быть оправдание, что «55 x 55» - это оптимальный размер для отображенияна iPad и iPhone.

Для изменения размера UIImage тупой силой я бы порекомендовал использовать методы «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]; 
0 голосов
/ 25 октября 2011

Используя категорию «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];
...