簡體   English   中英

防止CALayer renderInContext的抗鋸齒

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM