[英]Preventing antialiasing from CALayer renderInContext
我有一個非常簡單的UIView
包含一些黑色和白色的UIImageView
。 如果我通過設備上的物理按鈕截取屏幕截圖,結果圖像看起來與我看到的完全一樣(如預期的那樣) - 如果我在像素級別檢查圖像,它只是黑白圖像。
但是,如果我使用以下代碼片段以編程方式執行相同的操作,則生成的圖像具有應用的抗鋸齒功能 - 所有黑色像素都被微弱的灰色暈圈包圍。 我的原始場景中沒有灰色 - 它是純黑色和白色,“截圖”圖像的尺寸與我以編程方式生成的尺寸相同,但我似乎無法弄清楚灰色暈圈的來源。
UIView *printView = fullView;
UIGraphicsBeginImageContextWithOptions(printView.bounds.size, NO, 0.0);
CGContextRef ctx = UIGraphicsGetCurrentContext();
[printView.layer renderInContext:ctx];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);
UIGraphicsEndImageContext();
我試圖在調用renderInContext
之前添加以下內容以試圖阻止抗鋸齒,但它沒有明顯的效果:
CGContextSetShouldAntialias(ctx, NO);
CGContextSetAllowsAntialiasing(ctx, NO);
CGContextSetInterpolationQuality(ctx, kCGInterpolationHigh);
以下是兩個不同輸出的示例 - 左側是我的代碼生成的,右側是正常的iOS屏幕截圖:
由於我試圖將renderInContext
的輸出發送到單色打印機,因此打印機的抖動算法會導致灰色像素造成一些難看的偽像。
那么,我怎樣才能使renderInContext
產生與我的視圖相同的像素級輸出作為真實的設備截圖 - 即只是黑色和白色,就像在我的原始場景中一樣?
事實證明,問題與UIImageView
使用的底層UIImage
的解析有關。 UIImage
是使用數據提供程序創建的CGImage
。 CGImage
維度以與父UIImageView
相同的單位指定,但我使用的是具有視網膜顯示的iOS設備。
因為CGImage
尺寸是以非視網膜尺寸指定的, renderInContext
進行了放大,顯然這種放大的行為與實際屏幕渲染所做的不同。 (出於某種原因,真實屏幕渲染升級而不添加任何灰色像素。)
為了解決這個問題,我創建了我的CGImage
,其內容是UIImageView
兩倍,然后我對renderInContext
調用會產生更好的黑白圖像。 在一些白色區域中仍然有一些灰色像素,但它比原始問題有了很大的改進。
我終於通過更改對UIGraphicsBeginImageContextWithOptions()
的調用來強制它進行1.0的縮放,並注意到UIImageView
黑色像素渲染不再有灰色光暈。 當我強制UIGraphicsBeginImageContextWithOptions()
達到2.0的比例因子(這是因為視網膜顯示而導致默認),然后出現灰色暈圈。
我會嘗試設置
printView.layer.magnificationFilter
和
printView.layer.minificationFilter
至
kCAFilterNearest
圖像是否顯示在UIImageView
實例中? printView
是他們的printView
視圖嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.