2014-06-06 41 views
1

我有一些如何操作在CGImageRef像素值在Xcode

CGImageRef cgImage = "something" 

有沒有辦法來處理這個cgImage的像素值?例如,如果此圖像包含0.0001和3000之間的值,因此當我嘗試在NSImageView(How can I show an image in a NSView using an CGImageRef image

中以這種方式查看或釋放圖像時,我得到一個黑色圖像,所有像素都是黑色,我認爲它必須做將像素範圍值設置爲不同的顏色映射(我不知道)。

我希望能夠操縱或更改像素值或只能通過操縱色彩圖範圍來查看圖像。

我都試過,但顯然它不工作:

CGContextDrawImage(ctx, CGRectMake(0,0, CGBitmapContextGetWidth(ctx),CGBitmapContextGetHeight(ctx)),cgImage); 
UInt8 *data = CGBitmapContextGetData(ctx); 

for (**all pixel values and i++ **) { 
     data[i] = **change to another value I want depending on the value in data[i]**; 
     } 

謝謝

回答

2

爲了操縱單個像素的圖像

  • 在分配一個緩衝區來保存像素
  • 使用該緩衝區創建內存位圖上下文
  • 繪製圖像爲背景,這使像素到 緩衝
  • 變化的像素作爲所需
  • 從環境中創建一個新的形象
  • 釋放資源(注意一定要檢查使用儀器泄漏)

下面是一些示例代碼,以幫助您入門。該代碼將交換每個像素的藍色和紅色分量。

- (CGImageRef)swapBlueAndRedInImage:(CGImageRef)image 
{ 
    int x, y; 
    uint8_t red, green, blue, alpha; 
    uint8_t *bufptr; 

    int width = CGImageGetWidth(image); 
    int height = CGImageGetHeight(image); 

    // allocate memory for pixels 
    uint32_t *pixels = calloc(width * height, sizeof(uint32_t)); 

    // create a context with RGBA pixels 
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
    CGContextRef context = CGBitmapContextCreate(pixels, width, height, 8, width * sizeof(uint32_t), colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedLast); 

    // draw the image into the context 
    CGContextDrawImage(context, CGRectMake(0, 0, width, height), image); 

    // manipulate the pixels 
    bufptr = (uint8_t *)pixels; 
    for (y = 0; y < height; y++) 
     for (x = 0; x < width; x++) 
     { 
      red = bufptr[3]; 
      green = bufptr[2]; 
      blue = bufptr[1]; 
      alpha = bufptr[0]; 

      bufptr[1] = red;  // swaps the red and blue 
      bufptr[3] = blue;  // components of each pixel 

      bufptr += 4; 
     }  

    // create a new CGImage from the context with modified pixels 
    CGImageRef resultImage = CGBitmapContextCreateImage(context); 

    // release resources to free up memory 
    CGContextRelease(context); 
    CGColorSpaceRelease(colorSpace); 
    free(pixels); 

    return(resultImage); 
} 
+0

謝謝,這絕對會讓我開始。 – joseamck

+0

感謝這個非常漂亮的解決方案+1 –