2016-04-14 41 views
1

我有一個未掩蔽CGImage,每個像素使用四個字節RGBA,其最初的幾個像素是:哪裏從CGImageCreateWithMask產生的CGImage保持α值

C5 D2 D4 FF
C7 D4 D6 FF
C8 D5 D6 FF
C6 D4 D3 FF
C7 D5 D4 FF

我然後進行掩蔽的圖像中灰度級(即,一個每像素字節)

最後,我打電話給CGImageCreateWithMask敷面膜。所得到的掩蔽圖像的前幾個像素是:

C5 D2 D4 FF
C7 D4 D6 FF
C8 D5 D6 FF
C6 D4 D3 FF
C7 D5 D4 FF

如果我將這個CGImage轉換爲UIImage並將其添加到圖像控件中,這些前幾個像素正確地100%透明,但其底層像素不正確地爲100%不透明。

這是我用來查看任何CGImage字節的模式。

let imageCGDataProvider:CGDataProvider? = CGImageGetDataProvider(imageCG) 
let imageCGPixelData:CFData? = CGDataProviderCopyData(imageCGDataProvider!) 
let imageCGData:UnsafePointer<UInt8> = CFDataGetBytePtr(imageCGPixelData!) 

如何獲取被蒙版的CGImage中的像素的字節值,即應用了蒙版的字節值?

回答

1

這很有趣。看起來,掩蔽只適用於繪製的圖像

如果您對原始圖像的數據提供者以及蒙版圖像的數據提供者進行了指針比較,您會發現它們都有相同的數據提供者。我只能假設掩碼信息存儲在內部,並且只有在繪製實際圖像時才能訪問。

作爲一個設計決定,這對我來說沒有多大意義。如果您必須多次繪製相同的蒙版圖像,則必須多次重新蒙版相同的數據(儘管CGImage可能會在內部緩存結果)。如果你能夠取消掩蔽或重新掩蓋已經被掩蓋的CGImage - 但是AFAIK你不能掩蓋,這將非常有意義。

我最初希望CGImageCreateWithImageInRect()CGImageCreateCopy()將迫使CGImage掩模應用到底層數據 - 但它只是似乎傳遞相同的數據提供商,假設內部屏蔽信息一起。

我能找到擺脫被掩蓋的數據的唯一方法是實際在位圖上下文中繪製圖像。例如:

let ctx = CGBitmapContextCreate(nil, CGImageGetWidth(img), CGImageGetHeight(img), 8, 0, CGColorSpaceCreateDeviceRGB(), bitmapInfo.rawValue) 
CGContextDrawImage(ctx, CGRect(origin: CGPointZero, size: CGSize(width: CGImageGetWidth(img), height: CGImageGetHeight(img))), img) 
let data = UnsafeMutablePointer<UInt8>(CGBitmapContextGetData(ctx)) 

如果任何人更瞭解這一點 - 我肯定會有興趣知道!

+0

我最終使用了非常相似的代碼給你,+1用於發現指針是相同的。這當然值得被標記爲答案,但我會稍微拖延一下,以防萬一我們得到如何在沒有平局的情況下做到。我希望這沒關係 – dumbledad

+0

@dumbledad這很好,我還想看看如何做到這一點,而不必繪製(或手動掩蓋數據)的方法! – Hamish