ios - एक 'UIImageView' को 'पहलू फिट' मोड में एक नया UIImage फसल कैसे करें?




(3)

मुझे लगता है कि आप समझ नहीं पा रहे हैं कि आप क्या कर रहे हैं आप "फसल" नहीं कर सकते हैं एक UIImageView - केवल UIImages इसलिए आपकी फसल की गई इमेज विधि एक UIImage श्रेणी में होनी चाहिए और एक UIImageView श्रेणी नहीं होनी चाहिए। आप फसल पद्धति को पास की सीमा को छवि आकार के संबंध में होना चाहिए, न कि छवि दृश्य सीमा के अनुसार। यह अप्रासंगिक है कि छवि दृश्य का सामग्री मॉोड क्या है - छवि का फसल हमेशा एक ही काम करेगा। पहले छवि दृश्य से चित्र प्राप्त करें फिर इसे से एक नया क्रॉप छवि बनाएं और अंत में छवि दृश्य के लिए क्रॉप छवि सेट करें। यह कोड की एक पंक्ति में किया जा सकता है:

imageView.image = [imageView.image croppedImage:rect];

चूंकि आपका कंटेंटमोड 'पहलू फिट' है, इसलिए नई छवि स्वतः दृश्य फ्रेम में फ़िट होने के लिए फैल जाएगी आप पिक्सेलेशन प्रभाव से बचने के लिए image.size के आधार पर दृश्य फ़्रेम को बदलने का भी प्रयास कर सकते हैं।

मैं एक UIImageView के अंदर छवि फसल करके एक नया UIImage बनाना चाहूंगा। उदाहरण के लिए, ऊपर की तस्वीर में, मैं हरे रंग में उल्लिखित क्षेत्र का नया यूआईमेज करना चाहता हूं। मुझे ऐसा करने के लिए कोड मिला, सामान्यतः ऐसा कुछ दिखता है (एक UIImage श्रेणी के रूप में):

- (UIImage *)croppedImage:(CGRect)bounds {
    CGImageRef imageRef = CGImageCreateWithImageInRect([self CGImage], bounds);
    UIImage *croppedImage = [UIImage imageWithCGImage:imageRef];
    CGImageRelease(imageRef);
    return croppedImage;
}

सही समझ में आता है हालांकि, मेरा UIImageView सामग्री में है 'पहलू फिट' ऐसा लगता है कि सीजीएमटेक गणना को सीजीएमएग्रेरेक्ट विथ ImageInRect के लिए जटिल बनाता है और मैं सही समाधान का पता लगाने में असमर्थ हूं।

मुझे लगता है कि छवि के लिए किया गया था जैसे ही हरे रंग की rect करने के लिए एक ही परिवर्तन लागू करने की आवश्यकता है?

भी: मैं यह दूसरा प्रश्न यहां पाया ( छवि के आकार के बारे में जानने के बाद , यूआईएमएज वीव में छवि के लिए फिट कैसे ), जो आकार पाने का एक जबरदस्त बल दिखा रहा है, लेकिन मुझे अभी भी यकीन नहीं है कि यह कैसे फिट हो रहा है एक फसल स्थिति

कोई विचार?

संपादित करें : मेरे मामले में, मैं सचमुच एक वर्ग है जैसा ऊपर दिखाया गया है कि UIImageView पर ओवरले दृश्य में खींचा गया है। इसलिए जब मुझे लगता है कि मैं UIImage (UIImageView के अंदर) काट रहा हूँ, तो मुझे किसी भी तरह हरे रंग की सीजीआरएक्ट को बदलना होगा, जैसे कि 'पहलू फिट' लागू होने पर परिवर्तन 'मिलान' होता है। उदाहरण के लिए, यदि मैं 'UIImageView' शीर्ष बाएं मोड में छोड़ देता हूं, तो सबकुछ ठीक काम करता है, क्योंकि अंतर्निहित UIImage और UIImageView के बीच 1: 1 मानचित्रण है 'शीर्ष बाईं' मोड में समस्या यह है कि पूरी छवि हमेशा प्रदर्शित नहीं होती है, क्योंकि यह मेरे UIImageView से बड़ा हो सकता है


मुझे पता है कि उत्तर दिया गया है, लेकिन मुझे ऊपर से ऊपर उठने में कुछ समस्याएं थीं, मैं अपने समाधान को भी पोस्ट करने के लिए अभ्यस्त हूं।

समस्या यह है कि छवि को एक पहलू फिट से बढ़ाया जाता है, लेकिन हम चौड़ाई और ऊंचाई दोनों के लिए स्केल कारक जानते हैं फिर हम सही फसल का आयत बहुत आसान की गणना कर सकते हैं:

-(UIImage*)crop:(CGRect)frame
{
    // Find the scalefactors  UIImageView's widht and height / UIImage width and height
    CGFloat widthScale = self.bounds.size.width / self.image.size.width;
    CGFloat heightScale = self.bounds.size.height / self.image.size.height;

    // Calculate the right crop rectangle 
    frame.origin.x = frame.origin.x * (1 / widthScale);
    frame.origin.y = frame.origin.y * (1 / heightScale);
    frame.size.width = frame.size.width * (1 / widthScale);
    frame.size.height = frame.size.height * (1 / heightScale);

    // Create a new UIImage
    CGImageRef imageRef = CGImageCreateWithImageInRect(self.image.CGImage, frame);
    UIImage *croppedImage = [UIImage imageWithCGImage:imageRef];
    CGImageRelease(imageRef);

    return croppedImage;
}

इसी तरह के प्रश्न के लिए मेरे दूसरे उत्तर के आधार पर मैंने एक यूआईएमएज वीवीव श्रेणी के लिए यह विधि लिखा है:

-(CGRect) cropRectForFrame:(CGRect)frame
{
    NSAssert(self.contentMode == UIViewContentModeScaleAspectFit, @"content mode must be aspect fit");

    CGFloat widthScale = self.bounds.size.width / self.image.size.width;
    CGFloat heightScale = self.bounds.size.height / self.image.size.height;

    float x, y, w, h, offset;
    if (widthScale<heightScale) {
        offset = (self.bounds.size.height - (self.image.size.height*widthScale))/2;
        x = frame.origin.x / widthScale;
        y = (frame.origin.y-offset) / widthScale;
        w = frame.size.width / widthScale;
        h = frame.size.height / widthScale;
    } else {
        offset = (self.bounds.size.width - (self.image.size.width*heightScale))/2;
        x = (frame.origin.x-offset) / heightScale;
        y = frame.origin.y / heightScale;
        w = frame.size.width / heightScale;
        h = frame.size.height / heightScale;
    }
    return CGRectMake(x, y, w, h);
}

आप अपने हरे रंग की छत के फ्रेम में (यह मान सकते हैं कि यह छवि दृश्य का एक सबव्यूव्यूशन है) और यूआईएमएज फसल के लिए फसल को वापस प्राप्त कर सकते हैं। ध्यान दें कि यह केवल 'पहलू फिट' मोड के लिए काम करता है! मैंने हालांकि इसका परीक्षण नहीं किया है तो, मुझे बताओ कि यह काम करता है!





uiimage