2016-02-08 21 views
9

Bu sınıfın Swift sürümünü oluşturdum: https://github.com/bennythemink/ZoomRotatePanImageView/blob/master/ZoomRotatePanImageView.m İşleri güzel. Şimdi değiştirilmiş görüntüyü dosyaya kaydetmek istiyorum. Şey, tam çözünürlükte kaydetmek istiyorum ve ayrıca sadece kullanıcı tarafından görülebilen alanı kaydetmek istiyorum.Düzenleme, döndürme ve çevirme işlemlerini gerçekleştirdikten sonra görüntüyü düzenleme

Sana basit bir örnek gösterelim:

enter image description here

Bu benim app bu şekilde görünüyor. Görüntü iOS simülatöründe birkaç örnektir. Çoğu ekran dışı. Sadece görünen kısmı istiyorum. Bu gibi görünüyor kırpmadan kaydettikten sonra

: iyi olurdu kırpma sonra

enter image description here

Şimdiye kadar iyi.

Ama şimdi en bazı değişiklikler yapalım:

enter image description here

kaydettikten sonra: Yanlış pivot ile dönüştürülmüş oluyor gibi

enter image description here

görünüyor. Bunu nasıl düzeltebilirim?

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

Ancak çıkış görüntü gerçek görüntü görüntüsü boyutunu değil var ve tam olarak istiyorum:

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() 

bunu başarmak için daha basit bir yöntem var:

İşte tasarrufu için benim kod çözüm.

cevap

4
her boyutta görüntü ile çalışmak için

Güncelleme kod:

 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() 

Simülatörü ekran cevap Simulator

Kayıtlı görüntü Saved

+0

Teşekkür vurdu, ama böyle ben tam çözünürlükte görüntü istediklerini söyledi . Ekrana benzer bir çözünürlükte zaten bir çözüm gönderdim, sorumun alt bölümüne bakın. image! .drawInRect (imageView! .bounds) - bu, 4k görüntünün imageView boyutunda olmasına neden olur, bu nedenle ekran boyutuna bağlıdır. – Makalele

+0

Teşekkürler, sanırım yakınız. Neredeyse gerektiği gibi görünüyor. Ancak problem, ekran üzerinde sadece görünen kısmın düzgün bir şekilde kırpılması gerektiğidir (iPhone görüntüsüne sığdırmak için biraz daha az - daha az). Lütfen sınıfın tüm koduna bakın: Hazırlık kodu http://pastebin.com/6UUj1B0w kodunuzdadır. topImage, ekran görüntüsünde görebileceğiniz iPhone'dur. Boş görünüm denetleyicisindeki yeni projede kolayca test edebilirsiniz. Altta tek yöntem - nasıl göründüğünü gösterir. – Makalele

+0

ZoomRotatePanImageView her zaman en uygunudur. Yani topImageView ve imageView için çerçeve ayarlamanıza gerek yok, tam ekran boyutunu koru. İçerik modunuzu topImageView'ünüz için uygun hale getirin. Örneğimden ekran görüntüleri ekleniyor, beklendiği gibi çalışıyor. –

İlgili konular