2017-01-31 5 views
1

私は画面をいっぱいにするSceneKitビューを持っています。私の目標は、ユーザーがそのシーンのスナップショットを撮ることですが、スナップショットは画面全体ではなく、画面より少し小さいUIImageViewのインセット部分です。理想的には、ユーザは気付かないでください。上の画像は、その背後の画像と同じである必要があります。UIイメージを切り取る

snapshotcroppedを使ってこれをコーディングしましたが、画像でわかるように、縮尺が途切れてしまいます - 黄色の線の幅とウィンドウのサイズはどうですか?また、それは正しく配置されていない、それは多少ダウンして左からそれがある必要があります - 左上はウィンドウのラインの下にあるはずですが、あなたはそれがそれらの上の屋根上にあることがわかります。デバッガのQuickLookが表示を拒否したため、元のスナップショットが表示されません。私は無駄にさまざまなスケールとrectsを試してみました

let background = sceneView.snapshot().cgImage! 
    let cropped = background.cropping(to: overlayView.frame) 
    UIGraphicsBeginImageContextWithOptions(overlayView.frame.size, false, 1.0) 
    let context = UIGraphicsGetCurrentContext() 
    context!.setAlpha(0.50) 
    context!.draw(cropped!, in: overlayView.bounds) 
    let transparent = context!.makeImage(); 
    UIGraphicsEndImageContext() 
    overlayView.image = UIImage.init(cgImage: transparent!, scale: 1.0, orientation: .downMirrored) 

:それへの多くのコードはありません

enter image description here

は、誰もが問題を参照してください。私はこれが非常に簡単だと思います。

更新:何回か試してみたら、私はクイックビューを動作させることができました。スナップショットは、私が期待するように、実際にはバックグラウンド全体です。しかし、それは私が予想しているよりもはるかに大きくなっています - その640、998、切り取ったバージョンは228、304です。それは "ズーム"を説明しています。これは、インセットビューのフレームサイズがであり、画像サイズとは直接の関係ではないと考えています。それはどんな鐘を鳴らしますか?私はoverlayView.frameよりむしろ使用しなければならないいくつかの他のrectですか?

+0

ビューのcontentModeを設定しようとしましたか?また、jitteringEnabled = trueを設定してみてください。その後、スナップショットの後でオフにします。スナップショットイメージの品質は向上しますが、パフォーマンス上のペナルティがあるという欠点があります。 – sambro

+0

contentModeをより具体的にすることはできますか?それは私が試してみるべきもののように聞こえる。また、更新を参照してください。 –

+0

まあ、私は結果を2の倍数で単純に近づけることができました。どんな考えですか? –

答えて

0

だから私は、フレーム座標が1組のユニットにあり、画像座標が別のユニットにあるということを前提としています。極めては、私は彼らが並ぶように取得するにはYの出発点を調整しなければならなかった理由は、誰もがアイデアを持っている好奇心

let croprect = CGRect(x: overlayView.frame.origin.x * 2, y: overlayView.frame.origin.y * 2 - 45, width: overlayView.frame.width * 2, height: overlayView.frame.height * 2) 
    let drawrect = CGRect(x: 0, y: 0, width: overlayView.frame.width * 2, height: overlayView.frame.height * 2) 
    let background = sceneView.snapshot() 
    let cropped = background.cgImage!.cropping(to: croprect) 
    UIGraphicsBeginImageContextWithOptions(drawrect.size, false, 0.0) 
    let context = UIGraphicsGetCurrentContext() 
    context!.setAlpha(0.50) 
    context!.draw(cropped!, in: drawrect) 
    let transparent = context!.makeImage(); 
    UIGraphicsEndImageContext() 

私はだ:私はこのような問題を解決することができましたか?

+0

3番目のパラメータが「0」のBeginImageContextの呼び出しは大きな改善です。元のコードでスケールを任意に '1'に設定していると思ったことは想像できません。 – matt

+0

コード例。しかし、1や0で視覚的な効果はありませんでした。私は両方のオプションを両方の場所で試しました。 –

関連する問題