2011-04-27 66 views
0

我正在尋找一種簡單而有效的方法來給NSImage中包含的任何圖標賦予特殊的色調。我最初的需要ID有棕褐色的圖標,但如果可以使用其他顏色,它會更好。任何NSImage的棕褐色版本

你有什麼想法做到這一點?

預先感謝您的幫助,

問候,

+0

也許[這個答案](http://stackoverflow.com/questions/1117211/how-would-i-tint-an-image-programatically-on-the-iphone/1118005#1118005)(雖然它是爲iPhone)將有所幫助。 – 2011-04-27 06:49:09

回答

3

我想你會通過像素有取圖像像素和調整RGB值,以獲得效果。

-(UIImage*)makeSepiaScale:(UIImage*)image 
{ 
    CGImageRef cgImage = [image CGImage]; 
    CGDataProviderRef provider = CGImageGetDataProvider(cgImage); 
    CFDataRef bitmapData = CGDataProviderCopyData(provider); 
    UInt8* data = (UInt8*)CFDataGetBytePtr(bitmapData); 

    int width = image.size.width; 
    int height = image.size.height; 
    NSInteger myDataLength = width * height * 4; 


    for (int i = 0; i < myDataLength; i+=4) 
    { 
     UInt8 r_pixel = data[i]; 
     UInt8 g_pixel = data[i+1]; 
     UInt8 b_pixel = data[i+2]; 

     int outputRed = (r_pixel * .393) + (g_pixel *.769) + (b_pixel * .189); 
     int outputGreen = (r_pixel * .349) + (g_pixel *.686) + (b_pixel * .168); 
     int outputBlue = (r_pixel * .272) + (g_pixel *.534) + (b_pixel * .131); 

     if(outputRed>255)outputRed=255; 
     if(outputGreen>255)outputGreen=255; 
     if(outputBlue>255)outputBlue=255; 


     data[i] = outputRed; 
     data[i+1] = outputGreen; 
     data[i+2] = outputBlue; 
    } 

    CGDataProviderRef provider2 = CGDataProviderCreateWithData(NULL, data, myDataLength, NULL); 
    int bitsPerComponent = 8; 
    int bitsPerPixel = 32; 
    int bytesPerRow = 4 * width; 
    CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB(); 
    CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault; 
    CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault; 
    CGImageRef imageRef = CGImageCreate(width, height, bitsPerComponent, bitsPerPixel, bytesPerRow, colorSpaceRef, bitmapInfo, provider2, NULL, NO, renderingIntent); 

    CGColorSpaceRelease(colorSpaceRef); // YOU CAN RELEASE THIS NOW 
    CGDataProviderRelease(provider2); // YOU CAN RELEASE THIS NOW 
    CFRelease(bitmapData); 

    UIImage *sepiaImage = [UIImage imageWithCGImage:imageRef]; 
    CGImageRelease(imageRef); // YOU CAN RELEASE THIS NOW 
    return sepiaImage; 
} 

代碼被無恥地從這個SO線程複製,並且它談論施加棕褐色過濾器的UIImage代替NSImage中,但邏輯可以reused..Also this線程是最好的一個,當涉及到圖像處理..One書籤..

編輯:由於喬希卡斯威爾指出,核心圖像可以用來創建棕褐色圖像和某些圖像filtering..So更簡單的方法應該是使用核心圖片...閱讀他的回答如何做到這一點。這種方法也很好,尤其是在沒有coreImage框架的iPhone中。

+0

有沒有必要手工完成。 CoreImage不僅僅是任務。 – 2011-04-27 08:00:52

+0

正確Josh ..我不熟悉MAC開發。編輯我的答案..這是一個可惜的CoreImage是不存在的iPhone .. – Krishnabhadra 2011-04-27 08:25:21

+0

現在的核心圖像是在iPhone上.. https://developer.apple.com/library/ ios /#documentation/graphicsimaging/Conceptual/CoreImaging/ci_intro/ci_intro.html – Krishnabhadra 2012-04-24 05:30:29

6

CoreImage有built-in filters,其中之一是CISepiaTone,您可以輕鬆地使用它來轉換圖像的顏色和其他方面。

您需要按照Processing an Image被佈局的步驟:

得到一個CIContext對象。最簡單的方法可能是詢問當前的NSGraphicsContext

獲取圖像的CIImage表示形式。這不能直接從NSImage創建;您可能需要使用CGImageForProposedRect:context:hints:NSImage轉換爲CGImageRef(您可以通過NULL獲取proposedRect參數)。

創建濾鏡對象,設置其值並獲取處理後的圖像。

最後,在您的CIContext中繪製圖像。