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すると、グレースケール イメージではなく、アルファ マスクが要求されます。

まず、次を使用してコンテキストを初期化してみてくださいCGImageAlphaInfo.None(PDF にはアルファがないため)。

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

次に、PDF が常に行うように、コンテキストを白色で塗りつぶします。

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

次に、以前と同じように、PDF ページを描画して続行します。


グレースケールではなく、アルファビットマップを取得していたと思います。何も描画されていないゼロ (PDF では白が定義されています) と、一部のコンテンツが描画された (おそらく黒だったので) 1 です。ビットを検査すると、反転したグレーのビットマップとして表示される可能性があります。ビット単位で印刷するのではなく、常にレンダリングされた画像をデバッグしてください :)

于 2016-07-15T13:30:20.200 に答える
0

アルファチャンネルなしで画像コンテキストを作成してみてください:

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