2010-10-11 4 views
1

J'effectue la luminosité sur UIImage avec le code src suivant. Lorsque je vérifie ce code avec Instrument, la fuite de mémoire est de 1 Mo pour chaque appel de luminosité. Je change de luminosité avec le curseur. après le débogage appris à connaîtreLuminosité sans appel OpenGL

CFDataRef dataref=CGDataProviderCopyData(CGImageGetDataProvider(aInputImage.CGImage)); 

est de prendre une mémoire, quelqu'un peut me aider à optimiser ce code.

// ## Brightness without Open GL call 

    CGImageRef Brightness(UIImage* aInputImage, float aFactor) 
    { 
     CGImageRef img=aInputImage.CGImage; 

     CFDataRef dataref=CGDataProviderCopyData(CGImageGetDataProvider(aInputImage.CGImage)); 


     UInt8 *data=(UInt8 *)CFDataGetBytePtr(dataref); 

     int length=CFDataGetLength(dataref); 

     // Perform operation on pixels 
     for(int index=0;index<length;index+=4) 
     { 
      // Go For BRIGHTNESS 
      for(int i=0;i<3;i++) 
      { 
       if(data[index+i]+aFactor<0) 
       { 
        data[index+i]=0; 
       } 
       else 
       { 
        if(data[index+i]+aFactor>255) 
        { 
         data[index+i]=255; 
        } 
        else 
        { 
         data[index+i]+=aFactor; 
        } 
       } 
      } 
     } 

     // .. Take image attributes 
     size_t width=CGImageGetWidth(img); 
     size_t height=CGImageGetHeight(img); 
     size_t bitsPerComponent=CGImageGetBitsPerComponent(img); 
     size_t bitsPerPixel=CGImageGetBitsPerPixel(img); 
     size_t bytesPerRow=CGImageGetBytesPerRow(img); 

     // .. Do the pixel manupulation 
     CGColorSpaceRef colorspace=CGImageGetColorSpace(img); 
     CGBitmapInfo bitmapInfo=CGImageGetBitmapInfo(img); 
     CFDataRef newData=CFDataCreate(NULL,data,length); 
     CGDataProviderRef provider=CGDataProviderCreateWithCFData(newData); 

     // .. Get the Image out of this raw data 
     CGImageRef newImg=CGImageCreate(width,height,bitsPerComponent,bitsPerPixel,bytesPerRow,colorspace,bitmapInfo,provider,NULL,true,kCGRenderingIntentDefault); 

     // .. Prepare the image from raw data 
     UIImage* rawImage = [[UIImage alloc] initWithCGImage:newImg]; 

     // .. done with all,so release the references 
     CGImageRelease(newImg); 
     CGDataProviderRelease(provider); 
     CFRelease(dataref); 

     return rawImage.CGImage; 
    } 

Merci,

Sagar

Répondre

0

Etes-vous sûr que la fuite est l'endroit où vous dites qu'il est? Parce qu'il semble que vous n'avez pas fait CGRelease(newData); et fuit ainsi. En outre, l'instance rawImage sera divulguée, vous devez appeler autorelease dessus.

+0

Merci DarkDust. il a résolu le problème avec votre suggestion. –

1

code mis à jour est [peut être utile pour quelqu'un]

// ## Brightness without OpenGL call 

CGImageRef Brightness(UIImage* aInputImage, float aFactor) 
{ 
    CGImageRef img=aInputImage.CGImage; 

    CFDataRef dataref=CGDataProviderCopyData(CGImageGetDataProvider(aInputImage.CGImage)); 

    int length=CFDataGetLength(dataref); 
    UInt8 *data=(UInt8 *)CFDataGetBytePtr(dataref); 

    // Perform operation on pixels 
    for(int index=0;index<length;index+=4) 
    { 
     // Go For BRIGHTNESS 
     for(int i=0;i<3;i++) 
     { 
      if(data[index+i]+aFactor<0) 
      { 
       data[index+i]=0; 
      } 
      else 
      { 
       if(data[index+i]+aFactor>255) 
       { 
        data[index+i]=255; 
       } 
       else 
       { 
        data[index+i]+=aFactor; 
       } 
      } 
     } 
    } 

    // .. Take image attributes 
    size_t width=CGImageGetWidth(img); 
    size_t height=CGImageGetHeight(img); 
    size_t bitsPerComponent=CGImageGetBitsPerComponent(img); 
    size_t bitsPerPixel=CGImageGetBitsPerPixel(img); 
    size_t bytesPerRow=CGImageGetBytesPerRow(img); 

    // .. Do the pixel manupulation 
    CGColorSpaceRef colorspace=CGImageGetColorSpace(img); 
    CGBitmapInfo bitmapInfo=CGImageGetBitmapInfo(img); 
    CFDataRef newData=CFDataCreate(NULL,data,length); 
    CGDataProviderRef provider=CGDataProviderCreateWithCFData(newData); 

    // .. Get the Image out of this raw data 
    CGImageRef newImg=CGImageCreate(width,height,bitsPerComponent,bitsPerPixel,bytesPerRow,colorspace,bitmapInfo,provider,NULL,true,kCGRenderingIntentDefault); 

    // .. Prepare the image from raw data 
    UIImage* rawImage = [[[UIImage alloc] initWithCGImage:newImg] autorelease]; 

    // .. done with all,so release the references 
    CFRelease(newData); 
    CGImageRelease(newImg); 
    CGDataProviderRelease(provider); 
    CFRelease(dataref); 

    return rawImage.CGImage; 

} 
+0

pour une raison quelconque, cette méthode se bloque pour moi sur "\t \t \t \t \t \t données [index + i] + = valeur;" sur un appareil iOS 6 ... – SpaceDog

Questions connexes