2016-02-08 25 views
9

私はこのクラスのスウィフトバージョンを作成しました:https://github.com/bennythemink/ZoomRotatePanImageView/blob/master/ZoomRotatePanImageView.mいいです。これで、変更したイメージをファイルに保存します。私はそれを完全な解像度で保存したいと思っています。また、ユーザーにしか見えない領域を保存したいと思っています。ズーム、回転、パンニング後に編集した画像を保存する

私はあなたに簡単な例を示しましょう:

enter image description here

これは、それは私のアプリでどのように見えるかです。画像は、iOSシミュレータのサンプルの1つです。そのほとんどは画面外です。私は可視部分だけを欲しい。それは次のようになり、トリミングせずに保存した後

:それは素敵なことだクリッピング後

enter image description here

これまでのところは良いです。

しかし、今のは、いくつかの変更を加えてみましょう:

enter image description here

保存した後:それは間違っているピボットで形質転換しているよう

enter image description here

が見えます。どうすれば修正できますか?

UIGraphicsBeginImageContextWithOptions(imageContainer.bounds.size, false, 0) 
self.imageContainer.drawViewHierarchyInRect(imageContainer.bounds, afterScreenUpdates: true) 
let screenshot = UIGraphicsGetImageFromCurrentImageContext()! 
UIGraphicsEndImageContext() 

しかし、出力画像は、実際の画像をビューのサイズをしていないと私は完全な形でそれをしたい:

UIGraphicsBeginImageContextWithOptions(image.size, false, 0) 
    let context = UIGraphicsGetCurrentContext() 
    let transform = imageView.transform 
    let imageRect = CGRectMake(0, 0, image.size.width, image.size.height) 

    CGContextSetFillColorWithColor(context, UIColor.blueColor().CGColor) //for debugging 
    CGContextFillRect(context, imageRect) 

    CGContextConcatCTM(context, transform) 

    image.drawInRect(imageRect) 
    let newImage = UIGraphicsGetImageFromCurrentImageContext()! 
    UIGraphicsEndImageContext() 

それを達成するための簡単な方法があります:

はここに節約のために私のコードです解決。

答えて

4

任意のサイズの画像で動作するようにコードを更新:

 let boundsScale = imageView.bounds.size.width/imageView.bounds.size.height 
    let imageScale = image!.size.width/image!.size.height 

    let size = (image?.size)! 

    var canvasSize = size 

    if boundsScale > imageScale { 
     canvasSize.width = canvasSize.height * boundsScale 
    }else{ 
     canvasSize.height = canvasSize.width/boundsScale 
    } 

    let xScale = canvasSize.width/imageView.bounds.width 
    let yScale = canvasSize.height/imageView.bounds.height 

    let center = CGPointApplyAffineTransform(imageView.center, CGAffineTransformScale(CGAffineTransformIdentity, xScale, yScale)) 

    let xCenter = center.x 
    let yCenter = center.y 

    UIGraphicsBeginImageContextWithOptions(canvasSize, false, 0); 
    let context = UIGraphicsGetCurrentContext()! 

    //Apply transformation 
    CGContextTranslateCTM(context, xCenter, yCenter) 

    CGContextConcatCTM(context, imageView.transform) 

    CGContextTranslateCTM(context, -xCenter, -yCenter) 

    var drawingRect : CGRect = CGRectZero 
    drawingRect.size = canvasSize 

    //Transaltion 
    drawingRect.origin.x = (xCenter - size.width*0.5) 
    drawingRect.origin.y = (yCenter - size.height*0.5) 

    //Aspectfit calculation 
    if boundsScale > imageScale { 
     drawingRect.size.width = drawingRect.size.height * imageScale 
    }else{ 
     drawingRect.size.height = drawingRect.size.width/imageScale 
    } 

    image!.drawInRect(drawingRect) 

    let newImage = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 

シミュレータ画面がSimulator

保存された画像に答えためSaved

+0

感謝を撃ったが、私はフル解像度で画像をしたいと述べたように。私はすでに画面のような解像度でソリューションを投稿しました。私の質問の一番下を見てください。 image!.drawInRect(imageView!.bounds) - これは4kイメージをimageViewのサイズにするので、画面サイズによって異なります。 – Makalele

+0

ありがとう、私たちは近いと思います。それはほぼ同じように見えます。しかし問題は、画面上の目に見える部分だけに正確に切り取られる必要があることです(正確には、少し小さくする - iPhoneイメージに合わせるためです)。完全なクラスコードを見てください: http://pastebin.com/6UUj1B0w のprepareForSegueはあなたのコードです。 topImageはあなたがスクリーンショットで見ることができるiPhoneです。空のビューコントローラで新しいプロジェクトを簡単にテストできます。一番下には唯一の方法があります。どのように見えるかを示しています。 – Makalele

+0

ZoomRotatePanImageViewは常にアスペクトに適合します。したがって、topImageViewとimageViewのフレームを設定する必要はありません。フルスクリーンサイズを維持してください。コンテンツモードをtopImageViewに適したものに設定します。私のサンプルのスクリーンショットが添付され、期待どおりに動作します。 –

関連する問題