2012-01-31 73 views
2

我正在開發iPad(iOS4 +)的圖畫書應用程序。應用程序應該允許一次爲圖像的一個區域着色。從iOS的圖像的一部分創建蒙版

我的意思是,如果用戶觸摸屏幕上的任何位置並開始移動手指,則顏色只應用於與第一個觸摸點位於同一區域內的像素。例如,如果用戶觸摸左側圖像的中心並開始在圖像上移動手指,他應該得到類似正確圖像的東西。

enter image description here

我認爲,對於任務的解決方案之一可能是在該地區的形狀創建蒙感動,然後做進一步修改之前,這個面具應用到圖像。但是,說實話,我不知道從哪裏開始。

你能告訴我如何創建這樣一個面具?

該解決方案可能使用Core Graphics和Open GL。

+0

聽起來像[洪水填充算法]的任務(http://en.wikipedia.org/wiki/Flood_fill)。 – Till 2012-01-31 10:34:39

+0

@請問你能詳細說明一下嗎? – Bobrovsky 2012-01-31 10:36:13

+0

@Borbrovsky使用洪水填充來查找邊界並根據結果創建一個掩碼。 – Till 2012-01-31 10:38:11

回答

2

作爲@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 - 完全不透明)。