2011-03-24 154 views
17

我有一個具有部分透明度的單色圖像。我有正常和@ 2X版本的圖像。我希望能夠以代碼形式爲圖像着色另一種顏色。下面的代碼適用於正常圖像,但@ 2X最終會出現僞影。正常圖像可能有類似的問題如果是這樣,我無法通過解決方案檢測到它。如何在iOS中更改部分透明圖像的顏色?

+(UIImage *) newImageFromMaskImage:(UIImage *)mask inColor:(UIColor *) color { 
    CGImageRef maskImage = mask.CGImage; 
    CGFloat width = mask.size.width; 
    CGFloat height = mask.size.height; 
    CGRect bounds = CGRectMake(0,0,width,height); 

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
    CGContextRef bitmapContext = CGBitmapContextCreate(NULL, width, height, 8, 0, colorSpace, kCGImageAlphaPremultipliedLast); 
    CGContextClipToMask(bitmapContext, bounds, maskImage); 
    CGContextSetFillColorWithColor(bitmapContext, color.CGColor);  
    CGContextFillRect(bitmapContext, bounds); 

    CGImageRef mainViewContentBitmapContext = CGBitmapContextCreateImage(bitmapContext); 
    CGContextRelease(bitmapContext); 

    UIImage *result = [UIImage imageWithCGImage:mainViewContentBitmapContext]; 
    return result; 
} 

重要的是,蒙版圖像使用UIImage imageNamed:加載。另外,我確認了在視網膜模擬器上運行時加載了@ 2X圖像。

更新:上面的代碼有效。我看到的工件是由圖像消費者完成的附加轉換引起的。這個問題可以被刪除,因爲它不再是一個真正的問題,或者留給子孫後代。

+0

謝謝老兄你的問題解決了我的問題 – 2013-04-15 04:56:35

+1

這段代碼有漏洞(上'colorSpace',但更重要的是'mainViewContentBitmapContext',這可能在記憶中相當大)。請參閱我對以下答案的評論以獲取指示。 – AliSoftware 2014-12-22 20:00:13

回答

4

問題中的代碼是工作代碼。該錯誤是其他地方。

9

我已經更新上面的代碼要佔視網膜分辨率的圖片:

- (UIImage *) changeColorForImage:(UIImage *)mask toColor:(UIColor*)color { 

CGImageRef maskImage = mask.CGImage; 
CGFloat width = mask.scale * mask.size.width; 
CGFloat height = mask.scale * mask.size.height; 
CGRect bounds = CGRectMake(0,0,width,height); 

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
CGContextRef bitmapContext = CGBitmapContextCreate(NULL, width, height, 8, 0, colorSpace, (CGBitmapInfo)kCGImageAlphaPremultipliedLast); 
CGContextClipToMask(bitmapContext, bounds, maskImage); 
CGContextSetFillColorWithColor(bitmapContext, color.CGColor);  
CGContextFillRect(bitmapContext, bounds); 

CGImageRef mainViewContentBitmapContext = CGBitmapContextCreateImage(bitmapContext); 
CGContextRelease(bitmapContext); 

return [UIImage imageWithCGImage:mainViewContentBitmapContext scale:mask.scale orientation:UIImageOrientationUp]; 
} 
+0

適用於視網膜顯示。謝謝! – Colas 2014-12-09 15:13:47

+0

此代碼不尊重內存管理的CreateRule,並且無法釋放色彩空間。不要忘了'CGColorSpaceRelease(colorSpace)'以避免泄漏! – AliSoftware 2014-12-22 16:22:53

+0

(你也應該釋放'CGImageRed mainViewContentBitmapContext') – AliSoftware 2014-12-22 19:58:32