2015-05-04 3 views
0

Использование большой памяти при изменении размера и чертеже UIImage in rect.использование высокой памяти при изменении размера uiimage

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 
    { 
     UIImage *selectedImage=[info objectForKey:UIImagePickerControllerOriginalImage]; 

     // COMPRESSING IMAGE 
    NSData *selectedImageData=UIImageJPEGRepresentation(selectedImage, 0.5); 
     UIImage *selectedImageFromData=[UIImage imageWithData:selectedImageData]; 


     //SCALING UIIMAGE 
     UIImage *scaledImage=[[UIImage alloc]init]; 
     if (((selectedImageFromData.size.width>3264) && (selectedImageFromData.size.height>2448)) || ((selectedImageFromData.size.height>3264) && (selectedImageFromData.size.width>2448))) 
     { 
      CGFloat originalWidth=selectedImageFromData.size.width; 
       CGFloat originalHeight=selectedImageFromData.size.height; 
       CGFloat myWidth=2048; 
       CGFloat widthRatio=myWidth/originalWidth; 
       CGFloat dynamicHeight=widthRatio*originalHeight; 

     CGImageRef CoreGraphicsImage=selectedImageFromData.CGImage; 
     CGColorSpaceRef colorSpace = CGImageGetColorSpace(CoreGraphicsImage); 
     CGBitmapInfo bitmapInfo=CGImageGetBitmapInfo(CoreGraphicsImage); 
    CGImageGetBitsPerComponent(CoreGraphicsImage); 

     CGContextRef context=CGBitmapContextCreate(NULL, myWidth, dynamicHeight, CGImageGetBitsPerComponent(CoreGraphicsImage), CGImageGetBytesPerRow(CoreGraphicsImage), colorSpace, bitmapInfo); 


     CGContextSetInterpolationQuality(context, kCGInterpolationHigh); 
     CGContextDrawImage(context, CGRectMake(0, 0, myWidth, dynamicHeight), CoreGraphicsImage); 
     CGImageRef CGscaledImage=CGBitmapContextCreateImage(context); 
     UIImage *CGLastimage = [UIImage imageWithCGImage: CGscaledImage]; 


     NSLog(@"%f",CGLastimage.size.width); 
     NSLog(@"%f",CGLastimage.size.height); 

     VisualEffectImageVIew.image=CGLastimage; 
       BackgroundImageView.image=CGLastimage; 
       ForegroundImageView.image=CGLastimage; 
     } 
     else 
     { 
      NSLog(@" HEIGHT %f",selectedImageFromData.size.height); 
      NSLog(@" WIDTH %f",selectedImageFromData.size.width); 

     VisualEffectImageVIew.image=selectedImageFromData; 
     BackgroundImageView.image=selectedImageFromData; 
     ForegroundImageView.image=selectedImageFromData; 
     } 
     if(UI_USER_INTERFACE_IDIOM()==UIUserInterfaceIdiomPhone) 
     { 
      [picker dismissViewControllerAnimated:YES completion:nil]; 
     } 
     else 
     { 


      [popoverController dismissPopoverAnimated:YES]; 

      [self popoverControllerDidDismissPopover:popoverController]; 
     } 

    } 

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

enter image description here

+2

Просто потому, что вы загружаете JPEG в UIImage не означает, что он не должен декодировать каждый пиксель изображения и хранить его в памяти. FYI, 3200x2400 px = 7,68Mpix, в RGB (24 бит на пиксель) это дает 184,32 Мбит, или около 23 Мбайт. – Cyrille

+0

Да, но как это связано с моей проблемой? Здесь мы пытаемся масштабировать изображения с разрешением более 8 мегапикселей. И у нас не только проблемы с памятью, но и время сбоя приложения. Для получения дополнительной информации проверьте код на изображении выше, который использует тяжелую память. – USERX2DX

+0

Просто говорю, что это нормально, что изменение размеров мегапиксельных изображений занимает столько памяти. Как указано в ответах, вы должны определенно использовать некоторую оптимизированную библиотеку, такую ​​как GPUImage. – Cyrille

ответ

0

Когда дело доходит до изображений, я всегда был большим поклонником Brad Larson's GPUImage, он может делать все, что вы хотите, и использует GPU вместо CPU, который оставит вас с большим запасом мощности, чтобы избежать сбоев из-за на давление памяти.

А также это довольно хорошо.

This stackoverflow question также может помочь вам достичь желаемого, как только вы закончите настройку проекта.

Надеется, что это помогает :)

0

Вы используете процессор для рисования данных в кадр, я предлагаю вам использовать CGImage для розыгрыша в GPU контексте

- (UIImage *) scaleToSize: (CGSize)size 
{ 
    // Scalling selected image to targeted size 
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
    CGContextRef context = CGBitmapContextCreate(NULL, size.width, size.height, 8, 0, colorSpace, kCGImageAlphaPremultipliedLast); 
    CGContextClearRect(context, CGRectMake(0, 0, size.width, size.height)); 

    if(self.imageOrientation == UIImageOrientationRight) 
    { 
     CGContextRotateCTM(context, -M_PI_2); 
     CGContextTranslateCTM(context, -size.height, 0.0f); 
     CGContextDrawImage(context, CGRectMake(0, 0, size.height, size.width), self.CGImage); 
    } 
    else 
     CGContextDrawImage(context, CGRectMake(0, 0, size.width, size.height), self.CGImage); 

    CGImageRef scaledImage=CGBitmapContextCreateImage(context); 

    CGColorSpaceRelease(colorSpace); 
    CGContextRelease(context); 

    UIImage *image = [UIImage imageWithCGImage: scaledImage]; 

    CGImageRelease(scaledImage); 

    return image; 
} 
+0

Взгляните на наш обновленный код, CoreGraphics работает быстрее, но память Warmings and Crashes стала еще больше. (Отчет о памяти Показывает 150 МБ использования) .App Сбой при изменении размера следующего (второго) изображения .ALL Я ХОЧУ СКАЗАТЬ ЕГО СТАНЕТ СЕЙЧАС. – USERX2DX

+0

Жаль, что это не так быстро – USERX2DX

Смежные вопросы