2016-02-08 6 views
9

के बाद संपादित छवि को सहेजना मैंने इस वर्ग का स्विफ्ट संस्करण बनाया है: https://github.com/bennythemink/ZoomRotatePanImageView/blob/master/ZoomRotatePanImageView.m अच्छा काम करता है। अब मैं संशोधित छवि को फ़ाइल में सहेजना चाहता हूं। बात यह है कि मैं इसे पूर्ण संकल्प में सहेजना चाहता हूं और मैं उस क्षेत्र को भी सहेजना चाहता हूं जो केवल उपयोगकर्ता के लिए दृश्यमान है।ज़ूमिंग, घूर्णन और पैनिंग

मैं आपको सरल उदाहरण दिखा:

enter image description here

यह है कि यह कैसे मेरे एप्लिकेशन में दिखता है। छवि आईओएस सिम्युलेटर में कुछ नमूने है। इसमें से अधिकांश स्क्रीन से बाहर है। मुझे केवल दृश्य भाग चाहिए।

फसल यह इस तरह दिखता है बिना सहेजने के बाद:

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

उत्तर के लिए धन्यवाद, लेकिन जैसे मैंने कहा कि मैं पूर्ण संकल्प में छवि चाहते हैं । मैंने स्क्रीन-जैसी रेज में पहले से ही एक समाधान पोस्ट कर दिया है, मेरे प्रश्न के नीचे देखें। छवि! .drawInRect (imageView! .bounds) - इससे 4k छवि छवि के आकार का कारण बनती है, इसलिए यह स्क्रीन आकार पर निर्भर करता है। – Makalele

+0

धन्यवाद, मुझे लगता है कि हम करीब हैं। ऐसा लगता है कि यह लगभग चाहिए। लेकिन समस्या यह है कि इसे स्क्रीन पर केवल दृश्य भाग के लिए ठीक से फसल की आवश्यकता है (आईफोन छवि फिट करने के लिए थोड़ा सा सटीक होना)। कृपया पूरे वर्ग कोड में देखें: http://pastebin.com/6UUj1B0w तैयार करने के लिएForSegue आपका कोड है। शीर्ष छवि वह आईफोन है जिसे आप स्क्रीनशॉट पर देख सकते हैं। आप रिक्त दृश्य नियंत्रक में नई परियोजना पर आसानी से इसका परीक्षण कर सकते हैं। नीचे एकमात्र तरीका है - यह दिखाता है कि यह कैसा दिखना चाहिए। – Makalele

+0

ज़ूमरोटेटपैनइमेज व्यू हमेशा पहलू फिट है। तो अपने शीर्ष छवि दृश्य और छवि दृश्य के लिए फ्रेम सेट करने की आवश्यकता नहीं है, पूर्ण स्क्रीन आकार रखें। सामग्री मोड को अपने शीर्ष इमेज व्यू के लिए उपयुक्त फिट के रूप में सेट करें। मेरे नमूने से स्क्रीन शॉट संलग्न है, अपेक्षित के रूप में काम करता है। –

संबंधित मुद्दे