2016-07-01 7 views
1

У меня есть следующий фрагмент кода, чтобы преобразовать страницу PDF в CGImage:Преобразование PDF в CGImage поворачивает изображение к отрицательному

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) 
} 

Это превращает мою страницу PDF в самом деле в серой масштабируется битовой карты. Единственная проблема: результирующий цвет CGImage инвертирован (черные становятся белыми и наоборот). Я возился с параметрами CGBitmapContextCreate, но не повезло.

P.S. Я добавил этот кусок кода, чтобы полностью изменить отрицательного на положительный:

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) 
    } 
} 

, который работает, но, конечно, я хотел бы получить право изображения в первую очередь.

EDIT: Я, должно быть, делаю что-то глупое. Когда я сделать как выше и инвертировать всю картину, он выглядит как

enter image description here

, где оставил его искателя предварительный просмотр и право на рендеринге. Как я теперь заметил, это инвертирует части изображения. Я попытался с @Tricertops кодом и получил (черные блоки выше/ниже из списка с другими PDF-файлами)

enter image description here

и, очевидно, это имеет правильные значения серых, но есть некоторая черная маска, которая Подложка картина. Чистый текст слева теперь невидим, но изображения отображаются правильно.

ответ

2

Пропустив CGImageAlphaInfo.Only вы просите альфа-маски, а не черно-белое изображение, как вы можете думать.

Во-первых, попробуйте инициализировать контекст, используя CGImageAlphaInfo.None (потому что PDF-файлы не имеют альфа все равно):

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

Затем заполнить контекст с белым цветом, как и PDF-файлы всегда делать:

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

Затем продолжайте, как и раньше, путем рисования страницы PDF.


Я думаю, что вы получали альфа-растровое изображение, а не оттенки серого. Zeros, где ничего не было нарисовано (и PDF определяет, что белый) и Ones, где был составлен какой-то контент (как это было, вероятно, черным). Он может отображаться путем проверки битов как инвертированного серого растрового изображения. Всегда отлаживать изображения как визуализированные, а не печататься в битах :)

+0

Я пробовал это, но это все еще не похоже на смысл. Я добавил дополнительную информацию к моему вопросу. –

+0

Я не знаю, что я сделал вчера, но, очевидно, я не сознавал (достаточно). На самом деле это то, чего мне не хватало. Большое спасибо! –

0

Попробуйте создать контекст изображения без альфа-канала:

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

Это будет 'CGImageAlphaInfo.NoneSkipLast.rawValue', который не разрешен в документации и приводит к исключению. И kCGImageAlphaNone возвращает все черные ... –

+0

Извините, я не смог его протестировать. Для ссылки я имел в виду это SO [link] (http://stackoverflow.com/questions/24109149/cgbitmapcontextcreate-error-with-swift) и [this] (http://stackoverflow.com/questions/23723564/который-cgimagealphainfo-должны-мы использование). – lookaji

+0

Они оба относятся к цвету. Мне нужны оттенки серого. Что касается второго обращения к документам, которые вы видите, это не сработает. –