作爲@Till的建議,我實現了排隊填充算法。我必須做some optimizations以保持內存消耗和執行速度在合理的範圍內。
我不使用該算法來真正填充圖像。我用的算法創建口罩:
- 創建的面具字節數組(IMAGE_WIDTH * IMAGE_HEIGHT字節)
- 填充爲0xFF整個數組值
- 使用洪水填充算法來找出內的所有像素包含該區域的矩形的面積和座標。
- 對於每個找到的像素集,將掩碼字節數組中的對應值設置爲0
- 創建另一個(較小的陣列)掩碼字節並將掩碼字節陣列的部分(由計算矩形定義)複製到新陣列。
- 使用創建遮罩下面的代碼
NSData* maskData = // construct NSData from mask bytes
CGDataProviderRef dataProvider = CGDataProviderCreateWithCFData((CFMutableDataRef)maskData);
int width = maskRight - maskLeft + 1;
int height = maskBottom - maskTop + 1;
CGImageRef maskImage = CGImageMaskCreate(width, height, 8, 8, width, dataProvider, NULL, YES);
CGDataProviderRelease(dataProvider);
CGContextSaveGState(context);
CGContextTranslateCTM(context, 0.0, 768);
CGContextScaleCTM(context, 1.0, -1.0);
CGRect r = CGRectApplyAffineTransform(maskImageRect, CGContextGetCTM(context));
CGContextClipToMask(context, r, maskImage);
CGContextTranslateCTM(context, 0.0, 768);
CGContextScaleCTM(context, 1.0, -1.0);
// mask is setup, draw here
CGContextRestoreGState(context);
代碼中使用這個代碼,你可以創建任何面具形狀。如果需要,您甚至可以創建半透明遮罩。要創建半透明遮罩,您需要在透明區域的遮罩字節陣列中設置0以外的值(0 - 完全透明,255 - 完全不透明)。
聽起來像[洪水填充算法]的任務(http://en.wikipedia.org/wiki/Flood_fill)。 – Till 2012-01-31 10:34:39
@請問你能詳細說明一下嗎? – Bobrovsky 2012-01-31 10:36:13
@Borbrovsky使用洪水填充來查找邊界並根據結果創建一個掩碼。 – Till 2012-01-31 10:38:11