Verhindern des Antialiasing von CALayer renderInContext

8

Ich habe eine sehr einfache UIView mit ein paar schwarzen und weißen UIImageView s. Wenn ich einen Screenshot über die physischen Tasten auf dem Gerät mache, sieht das resultierende Bild genau wie das aus, was ich sehe (wie erwartet) - wenn ich das Bild auf der Pixelebene untersuche, ist es nur schwarz und weiß.

Wenn ich jedoch den folgenden Codeschnipsel benutze, um die gleiche Aktion programmatisch auszuführen, wird das resultierende Bild scheinbar mit Anti-Aliasing versehen - alle schwarzen Pixel sind von schwachen grauen Halos umgeben. Es gibt kein Grau in meiner ursprünglichen Szene - es ist rein schwarz und weiß und die Abmessungen des "screenshot" -Bildes sind die gleichen wie die, die ich programmatisch erzeuge, aber ich kann nicht herausfinden, woher das graue Halo kommt.

%Vor%

Ich habe versucht, Folgendes vor dem Aufruf von renderInContext hinzuzufügen, um das Antialiasing zu verhindern, aber es hat keine merklichen Auswirkungen:

%Vor%

Hier ist ein Beispiel der zwei verschiedenen Ausgänge - die linke Seite ist, was mein Code produziert und die rechte Seite ist ein normaler iOS-Screenshot:

Da ich versuche, die Ausgabe meines renderInContext an einen monochromen Drucker zu senden, verursacht das Vorhandensein von grauen Pixeln einige hässliche Artefakte aufgrund des Dithering-Algorithmus des Druckers.

Also, wie kann ich renderInContext erhalten, um die gleiche Pixel-Level-Ausgabe meiner Ansichten als ein echter Geräte-Screenshot zu erzeugen - d. h. nur Schwarz-Weiß, wie es in meiner Originalszene ist?

    
Brian Stormont 14.01.2013, 14:35
quelle

2 Antworten

4

Es stellte sich heraus, dass das Problem mit der Auflösung des zugrunde liegenden UIImage zusammenhing, das von UIImageView verwendet wurde. Das UIImage war ein CGImage , das mit einem Datenprovider erstellt wurde. Die CGImage Dimensionen wurden in den gleichen Einheiten angegeben wie die Eltern UIImageView , aber ich verwende ein iOS Gerät mit einem Retina Display.

Da die CGImage -Dimensionen in Nicht-Retina-Größe angegeben wurden, hat renderInContext das CGImage hochskaliert, und dieses Upscaling verhält sich offensichtlich anders als das tatsächliche Rendern des Bildschirms. (Aus irgendeinem Grund wurde das tatsächliche Bildschirm-Rendering skaliert, ohne dass graue Pixel hinzugefügt wurden.)

Um das Problem zu beheben, habe ich mein CGImage mit der doppelten Dimension von UIImageView erstellt, dann erzeugt mein Aufruf von renderInContext ein viel besseres Schwarz-Weiß-Bild. Es gibt immer noch ein paar graue Pixel in einem Teil des weißen Bereichs, aber es ist eine enorme Verbesserung gegenüber dem ursprünglichen Problem.

Ich habe das schließlich herausgefunden, indem ich den Aufruf in UIGraphicsBeginImageContextWithOptions() geändert habe, um eine Skalierung von 1.0 zu erzwingen, und bemerkte, dass das UIImageView schwarze Pixel-Rendering keinen grauen Halo mehr hatte. Wenn ich UIGraphicsBeginImageContextWithOptions() auf einen Skalierungsfaktor von 2.0 (was wegen der Retina-Anzeige standardmäßig verwendet wurde) erzwang, dann erschien das graue Haloing.

    
Brian Stormont 14.01.2013, 19:18
quelle
1

Ich würde versuchen, das

festzulegen %Vor%

und

%Vor%

bis

%Vor%

Werden die Bilder in UIImageView instances angezeigt? Ist printView ihr Superview?

    
Baldoph 14.01.2013 14:53
quelle

Tags und Links