Какой самый быстрый способ загрузить большое изображение на iPhone?

#objective-c

#objective-c

Вопрос:

Всем привет,

Я создаю scrollview, который прокручивает 100 изображений домов. Это работает. Но…. Для каждого просмотренного изображения выделяемая память увеличивается на 2,5 МБ. В конце концов приложение вышло из строя из-за нехватки памяти.

Я использую код для распаковки изображения ….. — (void)распаковать { const CGImageRef CGImage = [self CGImage];

 const int width = CGImageGetWidth(cgImage);
const int height = CGImageGetHeight(cgImage);

const CGColorSpaceRef colorspace = CGImageGetColorSpace(cgImage);
const CGContextRef context = CGBitmapContextCreate(
                                                   NULL, /* Where to store the data. NULL = don’t care */
                                                   width, height, /* width amp; height */
                                                   8, width * 4, /* bits per component, bytes per row */
                                                   colorspace, kCGImageAlphaNoneSkipFirst);

CGContextDrawImage(context, CGRectMake(0, 0, width, height), cgImage);
CGContextRelease(context);
  

}

но это не работает, очень много времени уходит на загрузку изображения.

Комментарии:

1. каков размер изображения?

2. Почему вы не загружаете его лениво?

3. Размер 300 * 404 разрешение 162,99

4. изображения получены с сервера

Ответ №1:

Я также сталкиваюсь с той же проблемой, решение, которое я выбрал, заключалось в том, что я изменил размер изображения в размере 320 * 460, а затем размер изображения стал примерно на 50 КБ, не более.Вы также можете сделать то же самое.

Код для изменения размера изображения:-

предположим, у вас есть ваше изображение в переменной image UIImage, а новое изображение сохраняется в editedImage, который также является объектом UIImage.

 if (self.image.size.height>460 || self.image.size.width>320) {
        UIGraphicsBeginImageContext(CGSizeMake(320,480));
        [self.image drawInRect: CGRectMake(0, 0,320,480)];
         self.editedImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext(); 

        NSLog(@"smallImage%f",self.editedImage.size.height);
        NSLog(@"smallImage%f",self.editedImage.size.width);
    }
    else {
        self.editedImage=self.image;
    }
  

Ответ №2:

Вам нужно провести некоторую оптимизацию памяти. Вот логика для экономии памяти, но вам нужно реализовать ее самостоятельно. Не добавляйте все изображения в scrollview, просто добавьте изначально 5 изображений. Предположим, пользователь просматривает image1, и теперь он переходит к image3 когда пользователь достигает изображения 3, удалите image1 из ScrollView, чтобы освободить память. И когда пользователь прокручивает вперед, добавляйте следующие изображения, например, когда пользователь находится на image4, добавляйте image6 и делайте наоборот. Когда пользователь переходит с image4 на image3, удалите image6 из памяти. Таким образом, в памяти будет только 5 изображений.

Ответ №3:

Три способа:

   1: Trying Apple's sample code called "StreetScroller", then you'll get to know how to make scrollview work definitely.

  2:Create thumbnails for large images and save to your own directory. Then read them from  url.

 3: Use UIpageviewcontroller