2016-07-01 8 views
1

に画像を回す:改宗者PDFは、私がCGImageにPDFのページを変換するために、次のコードを持っている負

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:私は何か愚かなことをしているに違いないと思います。私は上記のようにレンダリングして全体像を反転すると、それは、Finderのプレビューと右の私のレンダリング、それを左

enter image description here

のように見えます。今見てきたように、これは画像の一部を反転させます。私は@Tricertopsコードを試み、得(上/下で黒ブロックは、他のPDFファイルと、リストからのものである)

enter image description here

と明らかにこれが正しいグレイ値を有するが、アンダーレイ一部ブラックマスクがあります画像。左側の純粋なテキストは見えなくなりましたが、イメージは正しく表示されます。

答えて

2

あなたはアルファマスクではなく、あなたが考えることとグレースケール画像を求めているCGImageAlphaInfo.Only渡すこと。

まず、(PDFファイルはとにかくアルファを持っていないので)CGImageAlphaInfo.Noneを使用してコンテキストを初期化してみてください。

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

そして、白い色でコンテキストを埋め、PDFファイルが常にそうであるように:

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

その後、PDFページを描画することによって、これまでと同様に続行します。


グレースケールではなくアルファビットマップが表示されていると思います。何も描かれていない零点(そしてPDFは白を定義する)と、いくつかのコンテンツが描かれた(おそらく黒だった)Ones。ビットを反転グレービットマップとして検査することによって現れることができる。レンダリングされたイメージを常にビット単位で出力するのではなくデバッグします。

+0

私はそれを試みましたが、それはまだポイントを得るように見えません。私は私の質問にいくつかの情報を追加しました。 –

+0

私は昨日何をしたのか分かりませんが、明らかに私は意識していませんでした(十分)。確かにそれは私が欠けていたものです。どうもありがとう! –

0

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

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

これはドキュメントごとに許可されていない例外で、 'CGImageAlphaInfo.NoneSkipLast.rawValue'です。そして、kCGImageAlphaNoneはすべての黒を返します。 –

+0

私はそれをテストできませんでした。参照のために私はこのSO [リンク](http://stackoverflow.com/questions/24109149/cgbitmapcontextcreate-error-with-swift)と[this](http://stackoverflow.com/questions/23723564)を参照していました。/which-cgimagealphainfo-we-use)。 – lookaji

+0

両方とも色を参照しています。私はグレースケールが必要です。 2番目のドキュメントを参照すると、動作しないことがわかります。 –

関連する問題