2013-01-17 64 views
2

我試圖對具有不透明度的UIImage執行floodfill。我嘗試使用CG(http://en.wikipedia.org/wiki/Flood_fill)實現4-way floodfill,但是讀取像素顏色和着色像素使其變得太慢。填充300x100px區域需要一分多鐘。我需要一個功能,如:在UIImage上執行floodfill

-(UIImage*)floodFillOnImage:(UIImage*)image fromPoint:(CGPoint)start; 

這是足夠快。

有沒有人有Objective-C中的泛洪填充算法的工作實現或有一個想法與UIImages?我在一些iOS繪圖應用程序中看到過這樣一個油漆桶工具。

+0

不知道它是否可以寫,可以執行此 – epatel

+0

https://github.com/chinatndave/UIImageScanlineFloodfill – CRDave

回答

6

如果需要花費一分鐘時間來填充300×100圖像,則獲取和設置像素值的實現可能效率極低。如果您將圖像繪製到位圖上下文中,然後直接訪問(並修改)像素數據,則應該快得多。

的基本方法是將分配的存儲器緩衝器(4(RGBA)×寬×高的C數組字節),傳遞到CGBitmapContextCreate,繪製源圖像到所述上下文(例如,使用CGContextDrawImage),然後直接操作緩衝區(像素值)。完成後,您可以使用CGBitmapContextCreateImage從您的上下文創建圖像。

1

我想在不透明的UIImage上執行floodfill。

您是否試圖填寫清楚的區域?如果是這樣,那麼有一個更簡單的解決方案:創建一個上下文,用所需的顏色填充它,在上面繪製圖像,然後從上下文中提取完成的圖像。

如果你想以填補那些清楚,那麼就應該是一個解決方案,太區:創建一個背景下,第一次繪製圖像進去,上下文的混合模式設置爲source in,以填補顏色,然後提取完成的圖像。

+0

洪水填充操作將意味着它發現是像素的封閉區域的邊緣着色器相同(或相似)的顏色,例如着色書中的形狀。你不能通過簡單地合成一個圖像來做到這一點。 – omz

+0

@omz:如果目標「顏色」是透明度,或者與之相反,則可以。如果提問者確實試圖填充某種特定的顏色,那麼是的,他們將不得不採取不同的方法,比如你的方法。 –

+1

不,這不起作用,因爲填充(在成像軟件中通常使用的術語)在圖像中的特定點處開始*。假設你有一個透明的圖像,中間有一個輪廓圓圈。當你進行從中心點開始的填充填充時,該圓應該被填充,但不是圍繞它的(也是透明的)像素。 – omz