Сжатие и изменение размера больших изображений для iOS - PullRequest
2 голосов
/ 23 июня 2011

Я создаю приложение, основной функцией которого является отображение больших изображений в виде таблицы, некоторые могут иметь ширину 1000 пикселей и размер более 1 МБ.

Я обнаружил, что старые устройства (3GS) испытывают серьезные проблемы с их обработкой и быстро отправляют предупреждения о памяти.

Я не могу понять, какие изображения вводятся, но я подумал, что смогу уменьшить их как по размеру, так и по размеру файла.Поэтому я посмотрел в

NSData *dataForJPEGFile = UIImageJPEGRepresentation(img, 0.6)

для сжатия, но я не думаю, что это помогает с предупреждением памяти

и изменением размера как:

UIImage *newImage;
UIImage *oldImage = [UIImage imageWithData:imageData] ;
UIGraphicsBeginImageContext(CGSizeMake(tempImage.size.width,tempImage.size.height)); 
[oldImage drawInRect:CGRectMake(0, 0,320.0f,heightScaled)];
newImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext();

, а также сhttps://github.com/AliSoftware/UIImage-Resize

По сути, я хочу взять изображение и переформатировать его так, чтобы оно было меньше по размеру и размеру файла, а затем удаляло старое.Это лучший способ сделать это?Поможет ли кэширование изображений?Как с https://github.com/rs/SDWebImage?

Ответы [ 2 ]

2 голосов
/ 01 сентября 2014

Вы можете использовать CGImageSourceCreateThumbnailAtIndex для изменения размера больших изображений без предварительного их полного декодирования, что сэкономит много памяти и предотвратит сбои / предупреждения памяти.

Если у вас есть путь к изображению, размер которого вы хотите изменить, вы можете использовать это:

- (void)resizeImageAtPath:(NSString *)imagePath {
    // Create the image source (from path)
    CGImageSourceRef src = CGImageSourceCreateWithURL((__bridge CFURLRef) [NSURL fileURLWithPath:imagePath], NULL);

    // To create image source from UIImage, use this
    // NSData* pngData =  UIImagePNGRepresentation(image);
    // CGImageSourceRef src = CGImageSourceCreateWithData((CFDataRef)pngData, NULL);

    // Create thumbnail options
    CFDictionaryRef options = (__bridge CFDictionaryRef) @{
            (id) kCGImageSourceCreateThumbnailWithTransform : @YES,
            (id) kCGImageSourceCreateThumbnailFromImageAlways : @YES,
            (id) kCGImageSourceThumbnailMaxPixelSize : @(640)
    };
    // Generate the thumbnail
    CGImageRef thumbnail = CGImageSourceCreateThumbnailAtIndex(src, 0, options); 
    CFRelease(src);
    // Write the thumbnail at path
    CGImageWriteToFile(thumbnail, imagePath);
}

Подробнее здесь .

0 голосов
/ 23 июня 2011

Размер табличного представления должен быть изменен, конечно, он даже делает его лучше, чем большое изображение в маленьком кадре. Теперь, если проблема с хранилищем, и у вас есть сервер, с которого вы можете загружать большие изображения в любое время, вы можете реализовать своего рода кэширование в файловой системе. Храните в нем только n-МБ изображений, и всякий раз, когда запрашивается новое, которого в данный момент нет в файловой системе, удаляйте наименее использованное (или что-то еще) и загружайте новое.

Ps: не используйте +[UIImage imageNamed:]. У него есть некоторые ошибки в алгоритме кэширования или что-то, из-за чего он не высвобождает загруженные изображения, используя его.

...