200x200pt / px के लिए UIImage का आकार बदलें


83

मैं एक छवि का आकार बदलने के लिए संघर्ष कर रहा हूं। मूल रूप से मैं पर ठोकर खाई है: कैसे एक UIImage को कम करने और इसे धुँधली के बजाय एक ही समय में खस्ता / तेज बनाने के लिए?

यह एक कानूनी समाधान प्रतीत होता है लेकिन किसी तरह यह सही तरीके से काम नहीं कर रहा है।

मेरा ऐप कैमरा रोल से फोटो के साथ काम करता है। इस फ़ोटो को लगभग 200x200 आकार दिया जाना चाहिए जबकि चौड़ाई महत्वपूर्ण है, ऊँचाई नहीं।

दुर्भाग्य से, मैं एक नमूना कोड नहीं रख रहा हूं क्योंकि मैंने इसे गैर-काम के समाधान के बारे में अपने गुस्से में त्याग दिया था, क्षमा करें।


क्या ठीक से काम नहीं कर रहा है? आप किस परिणाम की उम्मीद करते हैं और आपको क्या परिणाम मिला?
ifau

मुझे 200 की चौड़ाई और इस अनुपात में x की ऊंचाई वाली छवि की उम्मीद है। मुझे अभी भी 1920x जैसी मूल छवि मिल रही है .... जो भी
स्विफ्ट_डैन

जवाबों:


150

यहाँ मेरा कोड है चित्र चौड़ाई 850 px है और 200 px नहीं है:

 func resizeImage(image: UIImage, newWidth: CGFloat) -> UIImage {

    let scale = newWidth / image.size.width
    let newHeight = image.size.height * scale
    UIGraphicsBeginImageContext(CGSizeMake(newWidth, newHeight))
    image.drawInRect(CGRectMake(0, 0, newWidth, newHeight))
    let newImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    return newImage
}


@IBAction func chooseImage(sender: AnyObject) {


    var myPickerController = UIImagePickerController()
    myPickerController.sourceType = UIImagePickerControllerSourceType.PhotoLibrary
    myPickerController.delegate = self;
    self.presentViewController(myPickerController, animated: true, completion: nil)


}

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject])

{
    var imagenow = info[UIImagePickerControllerOriginalImage] as? UIImage

    imageImage.image = resizeImage(imagenow!, newWidth: 200)



    pimg2 = imageImage.image!

    cidnew2 = textFieldCID!.text!
    pname2 = textFieldName!.text
    pmanu2 = textFieldMan!.text
    pnick2 = textFieldNick!.text
    podate2 = textFieldPODate!.text
    pno2 = textFieldArtNo!.text



    self.dismissViewControllerAnimated(true, completion: nil)

}

1
स्विफ्ट 3 में त्रुटियों से छुटकारा पाने के लिए, stackoverflow.com/ में दी गई जानकारी
37948158/1404324

3
स्विफ्ट 4 में काम करना: func resizeImage(image: UIImage, newWidth: CGFloat) -> UIImage { let scale = newWidth / image.size.width let newHeight = image.size.height * scale UIGraphicsBeginImageContext(CGSize(width: newWidth, height: newHeight)) image.draw(in: CGRect(x: 0, y: 0, width: newWidth, height: newHeight)) let newImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return newImage! }
mikey9

65

स्विफ्ट_डान के जवाब के आधार पर, स्विफ्ट 3 के लिए एक अपडेट

func resizeImage(image: UIImage, newWidth: CGFloat) -> UIImage? {

    let scale = newWidth / image.size.width
    let newHeight = image.size.height * scale
    UIGraphicsBeginImageContext(CGSize(width: newWidth, height: newHeight))
    image.draw(in: CGRect(x: 0, y: 0, width: newWidth, height: newHeight))

    let newImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    return newImage
}

2
आप रेटिना प्रदर्शनों में गुणवत्ता को बचाने और सेव पारदर्शी, उपयोग करना चाहते हैं: UIGraphicsBeginImageContextWithOptions (CGSize (चौड़ाई: newWidth, ऊंचाई: newHeight), झूठे, 0)
एव्जेनी Karev

इसने 18 एमबी से <1 एमबी तक मेरी छवि को कम कर दिया! मैंने इस्तेमाल किया: resizeImage (छवि: (जानकारी [UIImagePickerControllerOriginalIage] के रूप में? UIImage) !, newWidth: 200) एक iPad 9.7 पर। "Image ImageickerController से ली गई छवि। स्विफ्ट 3.0 का उपयोग करना
ब्रायन

43

यदि आप PNG छवियों के साथ काम कर रहे हैं जिनमें पारदर्शिता है, तो स्वीकृत उत्तर फ़ंक्शन वास्तव में पारदर्शी क्षेत्रों को काले रंग में बदल देगा।

यदि आप पारदर्शिता रखना चाहते हैं, तो इस फ़ंक्शन को आज़माएँ:

स्विफ्ट 4

extension UIImage {
    func scaleImage(toSize newSize: CGSize) -> UIImage? {
        var newImage: UIImage?
        let newRect = CGRect(x: 0, y: 0, width: newSize.width, height: newSize.height).integral
        UIGraphicsBeginImageContextWithOptions(newSize, false, 0)
        if let context = UIGraphicsGetCurrentContext(), let cgImage = self.cgImage {
            context.interpolationQuality = .high
            let flipVertical = CGAffineTransform(a: 1, b: 0, c: 0, d: -1, tx: 0, ty: newSize.height)
            context.concatenate(flipVertical)
            context.draw(cgImage, in: newRect)
            if let img = context.makeImage() {
                newImage = UIImage(cgImage: img)
            }
            UIGraphicsEndImageContext()
        }
        return newImage
    }
}

1
कमाल .. 200mb से 18: D
टॉम

3
आपको UIImage init को बदलकर स्क्रीन स्केल को भी ध्यान में रखना चाहिए:let scale = UIScreen.main.scale let newImage = UIImage(cgImage: context.makeImage()!, scale: scale, orientation: .up)
picciano

1
इस फ़ंक्शन पर% 30 उपयोगकर्ता क्रैश हो जाते हैं .. लाइन के संदर्भ में। Self (वापस। Self.cgImage !, in: newRect) ... क्रैश: com.apple.root.utility-qos 0x1001500a8 विशेष UIIRage.scaleImage (toSize: CGSize) - > UIImage?
Can Aksoy

1
धन्यवाद, @CanAksoy, मैंने मजबूर वैकल्पिक को हटा दिया, इससे मदद मिलनी चाहिए।
ट्रैविस एम।

21

स्विफ्ट 3.0 के लिए

बस इस स्निपेट को एक्सटेंशन के रूप में जोड़ें UIImage। हालाँकि, याद रखें कि छवि को चौकोर रूप में नहीं बनाया जा रहा है लेकिन अगर यह उस रूप में है, तो इसका परिणाम वर्ग होगा।

extension UIImage {
    func resizeImage(newWidth: CGFloat) -> UIImage {

        let scale = newWidth / self.size.width
        let newHeight = self.size.height * scale
        UIGraphicsBeginImageContext(CGSize(width: newWidth, height: newHeight))
        self.draw(in: CGRect(x: 0, y: 0, width: newWidth, height: newHeight))
        let newImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        return newImage!
    } }

इस कोड की कोशिश की। यह एक छोटी ;; एर छवि का उत्पादन करता है, लेकिन यह एक विशाल मेमोरी प्रिंट छोड़ता है - ढेर पर कुछ अतिरिक्त 100-200MB आवंटित करता है ((
rommex

10

स्विफ्ट 4.0 -

यदि आप उन छवियों से निपट रहे हैं जिनमें पारदर्शिता है, तो स्वीकृत उत्तर फ़ंक्शन वास्तव में पारदर्शी क्षेत्रों को काले रंग में बदल देगा।

यदि आप पारदर्शिता रखना चाहते हैं, तो इस फ़ंक्शन को आज़माएँ:

func resizeImageWith(image: UIImage, newSize: CGSize) -> UIImage {

    let horizontalRatio = newSize.width / image.size.width
    let verticalRatio = newSize.height / image.size.height

    let ratio = max(horizontalRatio, verticalRatio)
    let newSize = CGSize(width: image.size.width * ratio, height: image.size.height * ratio)
    var newImage: UIImage

    if #available(iOS 10.0, *) {
        let renderFormat = UIGraphicsImageRendererFormat.default()
        renderFormat.opaque = false
        let renderer = UIGraphicsImageRenderer(size: CGSize(width: newSize.width, height: newSize.height), format: renderFormat)
        newImage = renderer.image {
            (context) in
            image.draw(in: CGRect(x: 0, y: 0, width: newSize.width, height: newSize.height))
        }
    } else {
        UIGraphicsBeginImageContextWithOptions(CGSize(width: newSize.width, height: newSize.height), isOpaque, 0)
        image.draw(in: CGRect(x: 0, y: 0, width: newSize.width, height: newSize.height))
        newImage = UIGraphicsGetImageFromCurrentImageContext()!
        UIGraphicsEndImageContext()
    }

    return newImage
}

8

यह कोड iOS 10 में पेश किए गए UIGraphicsImageRenderer का उपयोग करता है : मेरे परीक्षण में यह UIGraphicsBeginImageContext (स्विफ्ट 4 / Xcode 9) के साथ पहले के नमूनों की तुलना में 10-40% तेज था:

extension UIImage {
        func renderResizedImage (newWidth: CGFloat) -> UIImage {
            let scale = newWidth / self.size.width
            let newHeight = self.size.height * scale
            let newSize = CGSize(width: newWidth, height: newHeight)

            let renderer = UIGraphicsImageRenderer(size: newSize)

            let image = renderer.image { (context) in
                self.draw(in: CGRect(origin: CGPoint(x: 0, y: 0), size: newSize))
            }
            return image
        }
    }

इसका जवाब पहले से ही उपलब्ध है: stackoverflow.com/a/45936836/1489885
HAS

1
@ मेरा कोड छोटा है, विस्तार के साथ किया गया है और मेरे प्रदर्शन का डेटा है।
रोममेक्स

हालाँकि मुझे वास्तव में यह उत्तर पसंद था (आधुनिक उपकरणों, तेज और संक्षिप्त कोडिंग का उपयोग करने के लिए) मुझे इसके साथ अनुभव किए गए अप्रत्याशित व्यवहार को इंगित करना चाहिए। यदि मूल UIImage कैमरे से क्रॉप किया गया है, और कुछ आकार है, (1180x850 कहते हैं) और मैं कोड को "स्केल डाउन टू न्यूविड": 800 करने के लिए कह रहा था, यह वास्तव में छवि का आकार निर्धारित करता है - क्योंकि यह डिवाइस 3x रेटिना था !! ! एक वांछित पैमाने के साथ एक UIGraphicsImageRendererFormat प्रदान करना होगा !!! खबरदार। हमें छोटी के बजाय बड़ी छवि मिली।
मोटी श्नोर

7

यह फ़ंक्शन आपके द्वारा निर्दिष्ट चौड़ाई के साथ एक छवि लौटाएगा :

func scaleImage(image: UIImage, maximumWidth: CGFloat) -> UIImage {
    let rect: CGRect = CGRectMake(0, 0, image.size.width, image.size.height)
    let cgImage: CGImageRef = CGImageCreateWithImageInRect(image.CGImage!, rect)!
    return UIImage(CGImage: cgImage, scale: image.size.width / maximumWidth, orientation: image.imageOrientation)
}

स्विफ्ट 3.0

func scaledImage(_ image: UIImage, maximumWidth: CGFloat) -> UIImage {
    let rect: CGRect = CGRect(x: 0, y: 0, width: image.size.width, height: image.size.height)
    let cgImage: CGImage = image.cgImage!.cropping(to: rect)!
    return UIImage(cgImage: cgImage, scale: image.size.width / maximumWidth, orientation: image.imageOrientation)
}

4

स्विफ्ट 4.2 में, अधिक से अधिक आकार का उपयोग करते हुए @rommex के उत्तर पर और सुधार :

private extension UIImage {
    func scaled(to maxSize: CGFloat) -> UIImage? {
        let aspectRatio: CGFloat = min(maxSize / size.width, maxSize / size.height)
        let newSize = CGSize(width: size.width * aspectRatio, height: size.height * aspectRatio)
        let renderer = UIGraphicsImageRenderer(size: newSize)
        return renderer.image { context in
            draw(in: CGRect(origin: CGPoint(x: 0, y: 0), size: newSize))
        }
    }
}

3

यह कोड चौकोर छवि पर उत्कृष्ट रूप से काम करता है और गुणवत्ता को नहीं खोएगा

extension UIImage {

func resize(targetSize: CGSize) -> UIImage {
    return UIGraphicsImageRenderer(size:targetSize).image { _ in
        self.draw(in: CGRect(origin: .zero, size: targetSize))
    }
}

}

उत्तर से: गुणवत्ता खोए बिना छवि का आकार बदलें


2

यदि आप प्रोजेक्ट में छवियों को लोड करने के लिए किंगफिशर का उपयोग कर रहे हैं और इसे यहां आकार देना चाहते हैं तो यह है:

  • Xcode 8
  • स्विफ्ट 3x

    let imageUrl = URL(string: "your image url")
     //Size refer to the size which you want to resize your original image
     let size = CGSize(width: 60, height: 60)
     let processImage = ResizingImageProcessor(targetSize: size, contentMode: .aspectFit)
     cell.courseTitleImage.kf.setImage(with: imageUrl! , placeholder: UIImage(named: "placeholder"), options: [.transition(ImageTransition.fade(1)), .processor(processImage)], progressBlock: nil, completionHandler: nil)
    

    या

    स्थानीय चित्र का आकार बदलें: - आप @Christoph R के उत्तर का उल्लेख कर सकते हैं


  • 1
    func getScaledDimension(width: CGFloat, height: CGFloat,new_width: CGFloat, new_height: CGFloat)->CGPoint {
    
            let widthAspect =  (width / new_width)
            let heightAspect = (height / new_height)
            if widthAspect == 0 || heightAspect == 0 {
                return CGPoint(x: width, y: height)
            }
            var width1 : CGFloat = 0
            var height1 : CGFloat =  0
            if widthAspect > heightAspect {
                width1 = (width) / heightAspect
                height1 = (height) / heightAspect
            } else {
                width1 = (width) / widthAspect
                height1 = (height) / widthAspect
            }
    
            return CGPoint(x: width1, y: height1 )
        }
    
    
    
        func ResizeImage(image: UIImage, targetSize: CGSize) -> UIImage {
    
            let rect = CGRectMake(0, 0, targetSize.width, targetSize.height)
    
            UIGraphicsBeginImageContextWithOptions(targetSize, false, 1.0)
            image.drawInRect(rect)
            let newImage = UIGraphicsGetImageFromCurrentImageContext()
            UIGraphicsEndImageContext()
    
            return newImage
        }
    
    
     let imagesize =  getScaledDimension(image.size.width, height: image.size.height , new_width: Width, new_height: Hieght)
    
            print("Image Size Scaled Dimension -> H:\(imagesize.x) W:\(imagesize.y)")
    
            let newImage = ResizeImage(image, targetSize: CGSizeMake(imagesize.x,imagesize.y))
            print("Resize Image Size -> H\(newImage.size.height) W\(newImage.size.width) ")
    

    1

    यह स्विफ्ट 3.0 के लिए पोस्ट किए गए @Christoph R के उत्तर के लिए एक निरंतरता है। यह कोड स्विफ्ट 5.0.1 के लिए काम करता है।

    static func resizeImage(image: UIImage, newWidth: CGFloat) -> UIImage {
    
        let scale = newWidth / image.size.width
        let newHeight = image.size.height * scale
        UIGraphicsBeginImageContext(CGSize(width: newWidth, height: newHeight))
        image.draw(in: CGRect(x: 0, y: 0, width: newWidth, height: newHeight))
        let newImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
    
        return newImage!
    }
    

    कॉलर साइट पर

    TaskUtilties.resizeImage(image: rawImage!, newWidth: CGFloat(50))
    

    0

    छवि आकार को 1024 से कम करें, आप हमेशा सर्वर क्षमता के अनुसार परिवर्तित कर सकते हैं

    func resizeImage(image: UIImage) -> UIImage {
    
            if image.size.height >= 1024 && image.size.width >= 1024 {
    
                UIGraphicsBeginImageContext(CGSize(width:1024, height:1024))
                image.draw(in: CGRect(x:0, y:0, width:1024, height:1024))
    
                let newImage = UIGraphicsGetImageFromCurrentImageContext()
                UIGraphicsEndImageContext()
    
                return newImage!
    
            }
            else if image.size.height >= 1024 && image.size.width < 1024
            {
    
                UIGraphicsBeginImageContext(CGSize(width:image.size.width, height:1024))
                image.draw(in: CGRect(x:0, y:0, width:image.size.width, height:1024))
    
                let newImage = UIGraphicsGetImageFromCurrentImageContext()
                UIGraphicsEndImageContext()
    
                return newImage!
    
            }
            else if image.size.width >= 1024 && image.size.height < 1024
            {
    
                UIGraphicsBeginImageContext(CGSize(width:1024, height:image.size.height))
                image.draw(in: CGRect(x:0, y:0, width:1024, height:image.size.height))
    
                let newImage = UIGraphicsGetImageFromCurrentImageContext()
                UIGraphicsEndImageContext()
    
                return newImage!
    
            }
            else
            {
                return image
            }
    
        }
    
    हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
    Licensed under cc by-sa 3.0 with attribution required.