2012-09-07 4 views
0

이미지에 필터를 추가하는 방법이 있습니다. 몇 달 전에 괜찮 았지만 지금은이 방법을 사용하려고하면 응용 프로그램이 이미지 버퍼에서 충돌합니다. 버퍼를 만들고 이미지의 데이터로 설정하면 나중에 특정 인덱스에 액세스하면 잘못된 액세스 충돌이 발생합니다. 나는 지난 1, 2 시간을 보았습니다. 그리고 지금 나는 뭔가가 내려다보고 있음을 확신합니다. 나는 어떤 것이 공개되어서는 안된다고 생각합니다. xcode의 ios DP 4 미리보기를 사용하고 있으며이 문제가 베타 버전의 업데이트로 시작했다고 생각하지만 실제로는 잘 모르겠습니다. UInt8 EXC_BAD_ACCESS

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

는 일반적으로 그것이 내가 확인 한 어느 aRed로 설정되어 루프의 첫 번째 중간 근처에있는에 충돌 라인이며, 그것은 밖으로 이동하지 말아야 버퍼 경계.

-(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; 
} 

내가 그냥 전체 방법을 복사 여분의 의견/정보를 원하시면 죄송합니다.

감사합니다,

Storealutes 내가 같은 문제가 없었다

답변

1

. 아래 코드를 사용하여 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);