2010-10-03 85 views
5

我已經屏蔽掉了我的形象,正是如此:CGImageCreateWithMask效果很好,但遮罩的區域在我的圖像中是黑色的,我怎樣才能將它設置爲白色?

CGImageRef maskRef = [[UIImage imageNamed:@"testMask2.png"] CGImage]; 

CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef), 
            CGImageGetHeight(maskRef), 
            CGImageGetBitsPerComponent(maskRef), 
            CGImageGetBitsPerPixel(maskRef), 
            CGImageGetBytesPerRow(maskRef), 
            CGImageGetDataProvider(maskRef), nil, YES); 

UIImage *image = [UIImage imageWithContentsOfFile:path]; 

CGImageRef masked = CGImageCreateWithMask([image CGImage], mask); 

imageView.image = [UIImage imageWithCGImage:masked]; 

而且它的偉大工程,但由此產生的圖像有BLACK它被屏蔽掉了,我怎麼可以將其設置有白凡其屏蔽掉?

回答

9

如果你正在屏蔽沒有alpha通道的JPEG圖像,會發生這種情況(黑色背景而不是透明)。

所以你需要屏蔽之前做這樣的事情:

CGImageRef imageNoAlpha = [UIImage imageNamed:@"noAlphaImage.jpg"].CGImage; 

CGColorSpaceRef cs = CGColorSpaceCreateDeviceRGB(); 

CGFloat width = CGImageGetWidth(imageNoAlpha); 
CGFloat height = CGImageGetHeight(imageNoAlpha); 

CGContextRef ctxWithAlpha = CGBitmapContextCreate(nil, width, height, 8, 4*width, cs, kCGImageAlphaPremultipliedFirst); 

CGContextDrawImage(ctxWithAlpha, CGRectMake(0, 0, width, height), imageNoAlpha); 

CGImageRef imageWithAlpha = CGBitmapContextCreateImage(ctxWithAlpha); 

CGImageRef masked = CGImageCreateWithMask(imageWithAlpha, mask); 

...

一定要釋放創建的圖像,背景和色彩空間...

+1

有一個小的錯字高度,它是獲得寬度,而不是 – 2016-09-12 14:42:03

+0

謝謝@BahriOkuroglu ...更正。 – 2016-09-13 18:04:10

0

該圖像被認爲是透明的,它被「蒙上」了;你看到的顏色將取決於你繪製的背景。

(我不記得是否有源圖像具有Alpha通道的要求。)

這可能是值得確保imageView.opaque = NO

+0

我將imageView背景的alpha設置爲0,並將opaque設置爲NO,但仍然變黑,我不知道黑色是否在CGImage級別,就像我必須將其繪製到上下文一樣。 – Shizam 2010-10-03 17:11:44

+0

Shizam:「黑度」就是當時圖像視圖下的任何東西。或者如果它是透明的,那是什麼。它一直都是烏龜! – rpetrich 2010-10-03 17:33:56

+0

Nah,作爲一個測試,我創建了PNG透明度,並將其放入該imageView中,並顯示直至背景顏色(藍色),但是如果將所產生的蒙版圖像置於其中仍爲黑色。我經歷了一個更長的操作來創建一個bitmapContext並將圖像繪製到它中,然後使用所得到的上下文作爲圖像的源代碼,該代碼正確地通過了alpha處理。奇怪的。 – Shizam 2010-10-03 18:33:34

0

嘗試這種情況:

imageView.opaque = NO; 
imageView.backgroundColor = [UIColor clearColor];

此外,用於掩蓋應黑白(非透明)的圖像。

0

我掙扎同樣的問題。該解決方案是非常簡單的: 這是最好的,爲掩蓋這種方式創建圖形上下文:

UIGraphicsBeginImageContextWithOptions(maskFrame.size, NO, 0.0); 
CGContextRef ctx = UIGraphicsGetCurrentContext(); 
CGRect ff = CGRectMake(0, 0, maskFrame.size.width, mask.size.height); 
CGContextClipToMask(ctx, ff, mask.CGImage); 
.... 

確保,在UIGraphicsBeginImageContextWithOptions第二個參數被設置爲NO(這意味着沒有不透明的背景下)。 另一個好處是這個創建功能可以自動將上下文縮放到視網膜顯示。

相關問題