2016-03-08 66 views
0

我已經通過使用不同的代碼解決了我的問題。我只想知道下面的錯在哪裏?無法更改UIImage中像素的顏色

我想用位圖數據改變UIImage中每個像素的顏色。我的代碼如下:

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UIImage *image = self.imageViewMain.image; 

    CGImageRef imageRef = image.CGImage; 
    NSData *data  = (NSData *)CFBridgingRelease(CGDataProviderCopyData(CGImageGetDataProvider(imageRef))); 
    char *pixels  = (char *)[data bytes]; 

    // this is where we manipulate the individual pixels 
    for(int i = 1; i < [data length]; i += 3) 
    { 
     int r = i; 
     int g = i+1; 
     int b = i+2; 
     int a = i+3; 

     pixels[r] = 0; // eg. remove red 
     pixels[g] = pixels[g]; 
     pixels[b] = pixels[b]; 
     pixels[a] = pixels[a]; 
    } 

    // create a new image from the modified pixel data 
    size_t width     = CGImageGetWidth(imageRef); 
    size_t height     = CGImageGetHeight(imageRef); 
    size_t bitsPerComponent   = CGImageGetBitsPerComponent(imageRef); 
    size_t bitsPerPixel    = CGImageGetBitsPerPixel(imageRef); 
    size_t bytesPerRow    = CGImageGetBytesPerRow(imageRef); 

    CGColorSpaceRef colorspace  = CGColorSpaceCreateDeviceRGB(); 
    CGBitmapInfo bitmapInfo   = CGImageGetBitmapInfo(imageRef); 
    CGDataProviderRef provider  = CGDataProviderCreateWithData(NULL, pixels, [data length], NULL); 

    CGImageRef newImageRef = CGImageCreate (
              width, 
              height, 
              bitsPerComponent, 
              bitsPerPixel, 
              bytesPerRow, 
              colorspace, 
              bitmapInfo, 
              provider, 
              NULL, 
              false, 
              kCGRenderingIntentDefault 
              ); 
    // the modified image 
    UIImage *newImage = [UIImage imageWithCGImage:newImageRef]; 

    // cleanup 
    free(pixels); 
    CGImageRelease(imageRef); 
    CGColorSpaceRelease(colorspace); 
    CGDataProviderRelease(provider); 
    CGImageRelease(newImageRef); 
} 

但此代碼運行時 - 我得到EXC_BAD_ACCESS錯誤如下圖所示一樣:

enter image description here

這裏是從調試的一些信息:

enter image description here

什麼是這是我失蹤或做錯了?

+0

我不認爲你應該變異數組你從[數據字節]獲得' – dan

+0

@dan:好的,但爲什麼我們不能,它只是一個數組。不是一個NSArray對象? –

+2

它是支持不可變對象的數組。它也被聲明爲'const'。如果你想修改它,使用'NSMutableData'上的'mutableBytes'方法 – dan

回答

0

嘗試分配存儲器陣列像素像下面的代碼

char *pixels = (char *)malloc(data.length); 
memcpy(pixels, [data bytes], data.length); 

當像素是沒有必要的,通過呼叫釋放該內存free(pixels)

+0

一些幫助,但在這個聲明給我同樣的錯誤「pixels [a] = pixels [a];」並且這些值如下所示:r = 3055613,g = 3055614,b = 3055615,a = 3055616 –

+0

@anoXomus我不知道您使用的算法是什麼,但似乎您確實循環內存不足。你的數據長度可能是3055616.因此,在索引0到3055615的像素內容對象中,當你訪問像素時[3055616]它會從內存中消失! – larva

+0

@anoXomus我認爲在你的算法中,你需要將數據從數據字節複製到像素數組。所以你可以像我編輯答案一樣使用memcpy – larva