2016-02-08 12 views
9

Utworzyłem wersję Swift tej klasy: https://github.com/bennythemink/ZoomRotatePanImageView/blob/master/ZoomRotatePanImageView.m Działa dobrze. Teraz chcę zapisać zmodyfikowany obraz do pliku. Chodzi o to, że chcę go zapisać w pełnej rozdzielczości, a także chcę zapisać obszar, który jest widoczny tylko dla użytkownika.Zapisywanie edytowanego obrazu po powiększeniu, obróceniu i panoramowaniu

Pokażę Ci prosty przykład:

enter image description here

Jak to wygląda w mojej aplikacji. Obraz jest jednym z kilku próbek w symulatorze iOS. Większość z nich jest poza ekranem. Chcę tylko widoczną część.

Po zapisaniu bez przycinania wygląda to tak:

enter image description here

tej pory tak dobrze po wycinek byłoby miłe.

Ale teraz zróbmy kilka zmian:

enter image description here

Po zapisaniu:

enter image description here

Wygląda na to zwerbowany przez niewłaściwym przegubu. Jak mogę to naprawić?

Oto mój kod do oszczędzania:

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

Jest prostszy sposób, aby go osiągnąć:

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

Jednak obraz ma rozmiar widoku nie rzeczywisty obraz i chcę go w całości rozkład.

Odpowiedz

4

Zaktualizowany kod do pracy z obrazem każdej wielkości:

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

ekran Simulator strzału Simulator

zapisany obraz Saved

+0

Dzięki za odpowiedź, ale jak powiedziałem, chcę obrazu w pełnej rozdzielczości . Już napisałem rozwiązanie w rozdzielczości ekranu, zobacz na dole mojego pytania. image! .drawInRect (imageView! .bounds) - powoduje to, że obraz 4k ma rozmiar obrazu, więc zależy to od rozmiaru ekranu. – Makalele

+0

Dzięki, myślę, że jesteśmy blisko. Wygląda prawie tak, jak powinien. Problem polega jednak na tym, że należy go odpowiednio przyciąć do widocznej tylko części ekranu (a dokładniej nieco mniej - aby dopasować obraz iPhone'a). Proszę spojrzeć na kod całej klasy: http://pastebin.com/6UUj1B0w w prepareForSegue to Twój kod. topImage to iPhone, który można zobaczyć na zrzucie ekranu. Możesz go łatwo przetestować na nowym projekcie w pustym kontrolerze widoku. Na dole jest jedyna metoda - pokazuje, jak powinna wyglądać. – Makalele

+0

ZoomRotatePanImageView jest zawsze dopasowany do kształtu. Nie trzeba więc ustawiać ramek dla topImageView i imageView, zachowując pełny rozmiar ekranu. Ustaw tryb zawartości jako spas pasujący do twojego topImageView. Zrzuty ekranu z mojej próbki są załączone, działają zgodnie z oczekiwaniami. –

Powiązane problemy