2016-07-01 10 views
1

Ich habe das folgende Stück Code, um eine PDF-Seite zu einem CGImage zu konvertieren:Konvertieren von PDF in CGImage dreht Bild zu negativer

func testPrint(pp:UnsafePointer<Void>) { // debug to see bits 
    var p = UnsafePointer<UInt8>(pp) 
    var res = "" 
    for _ in 0..<200 { 
    res += "\(p.memory) " 
    p = p.advancedBy(1) 
    } 
    print(res) 
} 

func pageOneFromPDF(file:String) -> CGImage? { 
    let url = NSURL(fileURLWithPath: file) 
    let pdfDocument = CGPDFDocumentCreateWithURL(url) 
    let pageOne = CGPDFDocumentGetPage(pdfDocument, 1) 
    let rect = CGPDFPageGetBoxRect(pageOne, .MediaBox) 

    let width = Int(rect.size.width) 
    let height = Int(rect.size.height) 
    let context = CGBitmapContextCreate(nil, width, height, 8, width, CGColorSpaceCreateDeviceGray(), CGImageAlphaInfo.Only.rawValue)! 
    CGContextClearRect(context, rect) 
    CGContextDrawPDFPage(context, pageOne) 
    testPrint(CGBitmapContextGetData(context)) 
    return CGBitmapContextCreateImage(context) 
} 

Dieser wandelt meine PDF-Seite in der Tat in einen grauen skalierten Bitmap. Das einzige Problem: Die resultierende CGImage Farbe ist invertiert (schwarz wird weiß und umgekehrt). Ich habe mit den Parametern CGBitmapContextCreate herumgespielt, aber kein Glück.

P.S. Ich habe dieses Stück Code, um die negativen zu positiven zu umkehren:

func inverse(pp:UnsafePointer<Void>, size:Int) { 
    var p = UnsafeMutablePointer<UInt8>(pp) 
    for _ in 0..<size { 
    p.memory = 255-p.memory 
    p = p.advancedBy(1) 
    } 
} 

, das funktioniert, aber natürlich würde Ich mag das Bild nach rechts in erster Linie zu bekommen.

EDIT: Ich muss etwas Dummes tun, denke ich. Wenn ich wie oben und invertieren das ganze Bild mache, sieht es aus wie

enter image description here

wo die Wiedergabe meint es die Finder-Vorschau und die links und rechts. Wie ich jetzt bemerke, invertiert dies Teile des Bildes. Ich habe versucht, mit @Tricertops Code und bekam (die schwarzen Blöcke oben/unten aus einer Liste mit anderen PDF-Dateien)

enter image description here

und offensichtlich hat dies die richtigen Grauwerte, aber es gibt einige schwarze Maske, die die unterlegt Bild. Der reine Text auf der linken Seite ist jetzt unsichtbar, aber die Bilder erscheinen korrekt.

Antwort

2

von CGImageAlphaInfo.Only vorbei Sie Alpha-Maske fordern, nicht Graubild als Sie vielleicht denken.

Versuchen Sie zunächst, den Kontext zu initialisieren CGImageAlphaInfo.None mit (da PDFs alpha ohnehin nicht hat):

CGBitmapContextCreate(nil, width, height, 8, width, CGColorSpaceCreateDeviceGray(), CGImageAlphaInfo.None.rawValue) 

dann den Zusammenhang mit weißer Farbe füllen, wie PDFs immer tun:

CGContextSetFillColorWithColor(context, UIColor.whiteColor().CGColor) 
CGContextFillRect(context, rect) 

Fahren Sie dann wie zuvor fort, indem Sie die PDF-Seite zeichnen.


Ich denke, Sie erhielten Alpha-Bitmap, nicht Graustufen. Nullen, wo nichts gezeichnet wurde (und PDF definiert dieses Weiß) und Einsen, wo ein Inhalt gezeichnet wurde (wie es wahrscheinlich schwarz war). Es könnte erscheinen, indem die Bits als invertierte graue Bitmap untersucht werden. Bilder immer als gerendert debuggen, nicht in Bits gedruckt :)

+0

Ich habe das versucht, aber das scheint immer noch nicht den Punkt zu bekommen. Ich habe einige weitere Informationen zu meiner Frage hinzugefügt. –

+0

Ich weiß nicht, was ich gestern gemacht habe, aber offensichtlich war ich nicht bewusst (genug). Genau das habe ich vermisst. Danke vielmals! –

0

versuchen, das Bild Kontext, ohne Alpha-Kanal erstellen:

let context = CGBitmapContextCreate(nil, width, height, 8, width, CGColorSpaceCreateDeviceGray(), kCGImageAlphaNoneSkipLast) 
+0

Das wäre 'CGImageAlphaInfo.NoneSkipLast.rawValue', was pro Dokumentation nicht erlaubt ist und zu einer Ausnahme führt. Und kCGImageAlphaNone gibt alle schwarzen ... –

+0

Entschuldigung, ich konnte es nicht testen. Aus Gründen der Bezugnahme bezog ich mich auf diese SO [link] (http://stackoverflow.com/questions/24109149/cgbitmapcontextcreate-error-with-swift) und [dies] (http://stackoverflow.com/questions/23723564/which-cgimagealphainfo-sollte-wir-verwenden. – lookaji

+0

Sie beide beziehen sich auf Farbe. Ich brauche Graustufen. Bezüglich des 2. Verweises auf die Dokumente, die Sie sehen, wird das nicht funktionieren. –