我有以下代码可以将 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
但没有运气。
PS我添加了这段代码来将负数反转为正数:
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)
}
}
这可行,但我当然希望首先得到正确的图像。
编辑:我想我一定是在做一些愚蠢的事情。当我像上面那样渲染并反转整个图片时,它看起来像
左边是Finder预览,右边是我的渲染。正如我现在注意到的那样,这会反转图像的某些部分。我尝试使用@Tricertops 代码并得到(上面/下面的黑色块来自其他PDF的列表)
显然,这具有正确的灰度值,但是有一些黑色蒙版覆盖了图片。左侧的纯文本现在不可见,但图像正确显示。