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:
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?
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.