1

我有以下代码可以将 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的列表)

在此处输入图像描述

显然,这具有正确的灰度值,但是有一些黑色蒙版覆盖了图片。左侧的纯文本现在不可见,但图像正确显示。

4

2 回答 2

2

通过传递,CGImageAlphaInfo.Only您要求的是 alpha 蒙版,而不是您可能认为的灰度图像。

首先,尝试使用初始化上下文CGImageAlphaInfo.None(因为 PDF 无论如何都没有 alpha):

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

然后用白色填充上下文,就像 PDF 一样:

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

然后像以前一样继续绘制 PDF 页面。


我认为你得到的是 alpha 位图,而不是灰度。没有绘制任何内容的零点(PDF 定义了白色)和绘制了一些内容的点(因为它可能是黑色的)。它可以通过将位检查为反转的灰色位图来显示。始终调试渲染的图像,而不是按位打印:)

于 2016-07-15T13:30:20.200 回答
0

尝试创建没有 alpha 通道的图像上下文:

let context = CGBitmapContextCreate(nil, width, height, 8, width, CGColorSpaceCreateDeviceGray(), kCGImageAlphaNoneSkipLast)
于 2016-07-01T16:11:45.677 回答