2012-09-07 3 views
0

J'ai une méthode qui va ajouter un filtre à une image. Cela a fonctionné correctement jusqu'à il y a quelques mois, maintenant lorsque j'essaie d'utiliser cette méthode, l'application va planter sur le tampon d'images. Je crée le tampon et le place dans les données de l'image, l'accès à l'index spécifique plus tard provoque un crash d'accès incorrect. J'ai regardé depuis une heure ou deux, et maintenant je suis convaincu qu'il y a quelque chose qui me manque. Je pense que quelque chose est en train d'être publié qui ne devrait pas l'être. J'utilise l'aperçu ios DP 4 de xcode, et je pense que ce problème a commencé avec la mise à jour de la version bêta, mais je ne suis pas vraiment sûr.UInt8 EXC_BAD_ACCESS

C'est la ligne, il se bloque sur situé boucle

m_PixelBuf[index+2] = m_PixelBuf[index+2]/*aRed*/; 

Normalement, il est réglé sur ARED Ce que j'ai vérifié près de la milieu du premier , et il ne devrait pas sortir de la tamponne les limites.

-(void)contrastWithContrast:(float)contrast colorWithColor:(float)color{ 
    drawImage.image = original; 
    UIImage * unfilteredImage2 = [[[UIImage alloc]initWithCGImage:drawImage.image.CGImage] autorelease]; 
    CGImageRef inImage = unfilteredImage2.CGImage;   
    CGContextRef ctx; 
    CFDataRef m_DataRef; 
    m_DataRef = CGDataProviderCopyData(CGImageGetDataProvider(inImage)); 
    UInt8 * m_PixelBuf = (UInt8 *) CFDataGetBytePtr(m_DataRef); 
    int length = CFDataGetLength(m_DataRef); 
    NSLog(@"Photo Length: %i",length); 
    //////Contrast///////////// 
    //NSLog(@"Contrast:%f",contrast); 
    int aRed; 
    int aGreen; 
    int aBlue; 
    for (int index = 0; index < length; index += 4){ 
    aRed = m_PixelBuf[index+2]; 
    aGreen = m_PixelBuf[index+1]; 
    aBlue = m_PixelBuf[index]; 

    aRed = (((aRed-128)*(contrast+100))/100) + 128; 
    if (aRed < 0) aRed = 0; if (aRed>255) aRed=255; 
    m_PixelBuf[index+2] = m_PixelBuf[index+2]/*aRed*/;//Always crashes here 

    aGreen = (((aGreen-128)*(contrast+100))/100) + 128; 
    if (aGreen < 0) aGreen = 0; if (aGreen>255) aGreen=255; 
    m_PixelBuf[index+1] = aGreen; 

    aBlue = (((aBlue-128)*(contrast+100))/100) + 128; 
    if (aBlue < 0) aBlue = 0; if (aBlue>255) aBlue=255; 
    m_PixelBuf[index] = aBlue; 
} 
ctx = CGBitmapContextCreate(m_PixelBuf, 
          CGImageGetWidth(inImage), 
          CGImageGetHeight(inImage), 
          CGImageGetBitsPerComponent(inImage), 
          CGImageGetBytesPerRow(inImage), 
          CGImageGetColorSpace(inImage), 
          CGImageGetBitmapInfo(inImage)); 
CGImageRef imageRef = CGBitmapContextCreateImage (ctx); 
UIImage* rawImage = [[UIImage alloc]initWithCGImage:imageRef]; 
drawImage.image = rawImage; 

[rawImage release]; 
CGContextRelease(ctx); 
CFRelease(imageRef); 
CFRelease(m_DataRef); 

unfilteredImage2 = [[[UIImage alloc]initWithCGImage:drawImage.image.CGImage] autorelease]; 
inImage = unfilteredImage2.CGImage;   
m_DataRef = CGDataProviderCopyData(CGImageGetDataProvider(inImage)); 
m_PixelBuf = (UInt8 *) CFDataGetBytePtr(m_DataRef); 
length = CFDataGetLength(m_DataRef); 

///////Color////////////////  
for (int index = 0; index < length; index += 4) 
{ 
    //Blue 
    if((m_PixelBuf[index] + ((int)color * 2))>255){ 
     m_PixelBuf[index] = 255; 
    }else if((m_PixelBuf[index] + ((int)color * 2))<0){ 
     m_PixelBuf[index] = 0; 
    } 
    else{ 
     m_PixelBuf[index]=m_PixelBuf[index] + ((int)color * 2); 
    } 

    //Green 
    if((m_PixelBuf[index+1] + ((int)color * 2))>255){ 
     m_PixelBuf[index+1] = 255; 
    }else if((m_PixelBuf[index+1] + ((int)color * 2))<0){ 
     m_PixelBuf[index+1] = 0;    
    } 
    else{ 
     m_PixelBuf[index+1]=m_PixelBuf[index+1] + ((int)color * 2); 
    } 

    //Red 
    if((m_PixelBuf[index+2] + ((int)color * 2))>255){ 
     m_PixelBuf[index+2] = 255; 
    }else if((m_PixelBuf[index+2] + ((int)color * 2))<0){ 
     m_PixelBuf[index+2] = 0;    
    } 
    else{ 
     m_PixelBuf[index+2]=m_PixelBuf[index+2] + ((int)color * 2); 
    } 

    //m_PixelBuf[index+3]=255;//Alpha 
} 

ctx = CGBitmapContextCreate(m_PixelBuf, 
          CGImageGetWidth(inImage), 
          CGImageGetHeight(inImage), 
          CGImageGetBitsPerComponent(inImage), 
          CGImageGetBytesPerRow(inImage), 
          CGImageGetColorSpace(inImage), 
          CGImageGetBitmapInfo(inImage)); 
imageRef = CGBitmapContextCreateImage (ctx); 
rawImage = [[UIImage alloc]initWithCGImage:imageRef]; 
drawImage.image = rawImage; 
[rawImage release]; 
CGContextRelease(ctx); 
CFRelease(imageRef); 
CFRelease(m_DataRef); 
//drawImage.image = unfilteredImage2; 
willUpdate = YES; 
} 

désolé pour les commentaires supplémentaires/informations Je viens de copier la méthode tout en.

Merci,

Storealutes

Répondre

1

J'ai eu le même problème. Vous devez utiliser le code ci-dessous pour obtenir un pointeur sur le tampon de pixels au lieu de CFDataGetBytePtr().

CGImageRef cgImage = originalImage.CGImage; 
size_t width = CGImageGetWidth(cgImage); 
size_t height = CGImageGetHeight(cgImage); 

char *buffer = (char*)malloc(sizeof(char) * width * height * 4); 
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
CGContextRef cgContext = CGBitmapContextCreate(buffer, width, height, 8, width * 4, colorSpace, kCGImageAlphaPremultipliedLast); 
CGContextSetBlendMode(cgContext, kCGBlendModeCopy); 
CGContextDrawImage(cgContext, CGRectMake(0.0f, 0.0f, width, height), cgImage); 

free(buffer); 
CGContextRelease(cgContext); 
CGColorSpaceRelease(colorSpace);