2012-12-31 141 views
2

這是我的代碼爲造型圖像。在上述版本的iOS4.3 &中,代碼正常工作,但在iOS 6中,它崩潰了。崩潰:UIImage風格與iOS 6的代碼崩潰?

enter image description here

-(UIImage *)grayImage:(UIImage *)image 
{ 
    CGImageRef img= image.CGImage;//imageSelected.CGImage;//self.originalPhoto.CGImage; 

    CFDataRef dataref=CGDataProviderCopyData(CGImageGetDataProvider(img)); 

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

    for(int index=0;index<length;index+=4){ 
     Byte grayScale = 
     (Byte)(data[index+3]*.11 + 
       data[index + 2] * .59 + 
       data[index + 1] * .3); 

     //set the new image's pixel to the grayscale version 
     data[index+1] = grayScale;// Code Crash here , By SIGABRAT (Exe_Bad_Access) 
     data[index+2] = grayScale; 
     data[index+3] = grayScale; 
    } 
    // .. 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 
    CFRelease(newData); 
    CGImageRelease(newImg); 
    CGDataProviderRelease(provider); 
    CFRelease(dataref); 

    return rawImage; 

} 

什麼是錯誤的代碼?

+4

後崩潰報告PLZ? – Omarj

+0

爲什麼你是雙引號指針? – CodaFi

+1

我已經檢查過,但沒有在iOS6模擬器中崩潰。這個崩潰發生在設備 –

回答

1

請地方CFDataRef的使用CFMutableDataRef如下

CFDataRef m_DataRef = CGDataProviderCopyData(CGImageGetDataProvider(inImage)); 
//->write this: 
CFMutableDataRef m_DataRef = CFDataCreateMutableCopy(0, 0, CGDataProviderCopyData(CGImageGetDataProvider(inImage))); 

UInt8 * m_PixelBuf = (UInt8 *) CFDataGetBytePtr(m_DataRef); 
//->write this 
UInt8 *m_PixelBuf=(UInt8 *)CFDataGetMutableBytePtr(m_DataRef);