वेक्टर छवियां Xcode (यानी पीडीएफ फाइलें) में कैसे काम करती हैं?


177

वेक्टर Xcode 6 में कैसे काम करता है?

जब मैं एक छवि का आकार बदलने की कोशिश करता हूं, तो यह दांतेदार दिखता है, क्या देता है?

जवाबों:


351

Xcode में वैक्टर का उपयोग कैसे करें (7 और 6.3+):

  1. एक छवि को .pdf फ़ाइल के रूप में उचित @ 1x आकार (जैसे टूलबार बटन के लिए 24x24 ) पर सहेजें ।
  2. अपनी Images.xcassets फ़ाइल में, एक नया इमेज सेट बनाएं ।
  3. में इंस्पेक्टर गुण , सेट स्केल कारक के लिए एकल वेक्टर
  4. अपनी पीडीएफ फाइल को ऑल, यूनिवर्सल सेक्शन में खींचें और छोड़ें ।
  5. अब आप अपनी छवि को उसके नाम से संदर्भित कर सकते हैं, जैसे आप किसी भी .png फ़ाइल को।

    UIImage(named: "myImage")

Xcode (6.0 - 6.2) के पुराने संस्करणों में वैक्टर का उपयोग कैसे करें:

  • चरण 3 को छोड़कर, उपरोक्त चरणों का पालन करें, प्रकारों को वैक्टर पर सेट करें

Xcode में वैक्टर कैसे काम करते हैं

वेक्टर समर्थन Xcode में भ्रामक है, क्योंकि जब अधिकांश लोग वैक्टर के बारे में सोचते हैं, तो वे उन छवियों के बारे में सोचते हैं जो ऊपर और नीचे पैमाने पर कर सकते हैं और फिर भी अच्छे दिख सकते हैं। हालाँकि, Xcode 6 और 7 में iOS के लिए पूर्ण वेक्टर समर्थन नहीं है, इसलिए चीजें थोड़ी अलग तरह से काम करती हैं।

वेक्टर प्रणाली वास्तव में सरल है । यह अपने लेता .pdfछवि, और बनाता है @1x.png, @2x.pngऔर @3x.pngपर संपत्ति का निर्माण समय । (आप इसे सत्यापित करने के लिए Assets.car की सामग्री की जांच करने के लिए एक उपकरण का उपयोग कर सकते हैं ।)

उदाहरण के लिए, मान लें कि आप foo.pdf44x44 वेक्टर संपत्ति हैं। पर निर्माण समय यह निम्न फ़ाइलें उत्पन्न करेगा:

  • foo@1x.png 44x44 पर
  • foo@2x.png 88x88 पर
  • foo@3x.png 132x132 पर

यह किसी भी आकार की छवि के लिए समान काम करता है। उदाहरण के लिए, यदि आपके पास bar.pdf100x100 है, तो आपको मिलेगा:

  • bar@1x.png 100x100 पर
  • bar@2x.png 200x200 पर
  • bar@3x.png 300x300 पर

प्रभाव:

  • आप छवि के लिए एक नया आकार नहीं चुन सकते ; यह केवल तभी अच्छा लगेगा जब आप इसे 44x44 आकार में रखेंगे। कारण यह है कि पूर्ण वेक्टर समर्थन लागू नहीं किया गया है । इन वैक्टरों को केवल आप अपनी छवि संपत्ति को बचाने का समय बचा सकते हैं। यदि आपके पास एक उपकरण (उदाहरण के लिए एक फ़ोटोशॉप स्क्रिप्ट) है जो पहले से ही इसे एक-चरणीय प्रक्रिया बनाता है, तो केवल एक चीज जो आप पीडीएफ वैक्टर का उपयोग करके प्राप्त करेंगे, वह है भविष्य के सबूत का समर्थन (जैसे कि अगर आईओएस 9 में Apple को @ 4x संपत्ति की आवश्यकता शुरू होती है, ये बस काम करेंगे), और आपके पास बनाए रखने के लिए कम फाइलें होंगी ।
  • आपको पीडीएफ फाइलों के रूप में सहेजे गए @ 1x आकार में अपनी सभी संपत्तियों के लिए पूछना चाहिए । अन्य बातों के अलावा, यह UIImageViews को सही आंतरिक सामग्री आकार प्रदान करने की अनुमति देगा।

क्यों यह (शायद) इस तरह से काम करता है:

  • यह पिछले iOS संस्करणों के साथ इसे पीछे की ओर संगत बनाता है ।
  • वैक्टर का आकार बदलना रनटाइम के दौरान एक कम्प्यूटेशनल गहन कार्य हो सकता है; इस तरह इसे लागू करने से, प्रदर्शन हिट नहीं होते हैं

8
अच्छा लिखो। इसकी चर्चा 2014 डब्ल्यूडब्ल्यूडीसी सत्र 411 - "व्हाट्स न्यू इन इंटरफेस बिल्डर" 44:13 के समय पर हुई। ध्यान दें कि वे कहते हैं कि रेखांकन समय पर किया जाता है। मैक पर दिलचस्प रूप से यह रनटाइम पर वैक्टर का उपयोग करेगा। भविष्य में कुछ दूर बिंदु पर उम्मीद है कि iOS भी होगा।
माइक वोसेलर

15
यह दुर्भाग्य से स्लाइस मानों को मापता नहीं है। इसलिए यदि आप 5 पर कोनों को काटते हैं तो यह 2x और 3x छवियों के लिए 10 और 15 के पैमाने पर नहीं होगा।
जेसी

5
@ जेसे यदि आप स्लाइस मानों को स्केल करना चाहते हैं, तो आप इसे resizableImageWithCapInsets:अपने स्लाइस मानों का उपयोग करके और विभाजित करके कोड में स्वयं कर सकते हैं[UIScreen mainScreen].scale
Arie Litovsky

1
स्लाइसिंग पर @ArieLitovsky सुझाव स्पष्ट करने के लिए: आपको परिसंपत्ति से स्लाइसिंग को हटा देना चाहिए और इसे कोड में स्थानांतरित करना चाहिए , कुछ इस तरहCGFloat scale = [UIScreen mainScreen].scale; UIImage *image = [[UIImage imageNamed:@"my_unsliced_asset"] resizableImageWithCapInsets:UIEdgeInsetsMake(10 * scale, 11 * scale, 12 * scale, 13 * scale)];
ग्लाइसुक

6
मैं XCode 8 के लिए यह कैसे करूँ? विकल्प गायब हो गया है लगता है!
गेराल्ड

26

Xcode 8 में, आप अभी भी एक पीडीएफ जोड़ सकते हैं, एक नया छवि सेट बना सकते हैं, और गुण निरीक्षक में, स्केल टू सिंगल स्केल विकल्प सेट कर सकते हैं। यहां छवि विवरण दर्ज करें


15

यह @Senseful द्वारा उत्कृष्ट उत्तर का पूरक है।

.Pdf प्रारूप में वेक्टर चित्र कैसे बनाएं

मैं बताऊंगा कि यह कैसे करना है Inkscape क्योंकि यह मुफ़्त और खुला स्रोत है लेकिन अन्य कार्यक्रम समान होने चाहिए।

Inkscape:

  1. एक नया प्रोजेक्ट बनाएं।
  2. फाइल> डॉक्यूमेंट प्रॉपर्टीज पर जाएँ और कस्टम पेज साइज़ को px में यूनिट्स के साथ आपके @ 1x साइज़ (44x44, 100x100, आदि) पर सेट करें।
  3. अपनी कलाकृति बनाओ।
  4. फाइल> सेव अस ...> प्रिंट करने योग्य डॉक्यूमेंट फॉर्मेट (* .pdf)> सेव> ओके पर जाएं। (वैकल्पिक रूप से, आप Print> Print to File> Output format: PDF> Print पर जा सकते हैं लेकिन उतने विकल्प नहीं हैं)

टिप्पणियाँ:

  • जैसा कि स्वीकृत उत्तर में बताया गया है, आप अपनी छवि का आकार परिवर्तन नहीं कर सकते क्योंकि Xcode अभी भी बिल्ड समय पर रेखापुंज छवियों का उत्पादन करता है। यदि आपको अपनी छवि का आकार बदलने की आवश्यकता है, तो आपको एक अलग आकार के साथ एक नई .pdf फ़ाइल बनानी चाहिए।
  • यदि आपके पास पहले से ही .svg छवि है जो गलत पृष्ठ आकार है, तो निम्न कार्य करें:

    1. पृष्ठ का आकार बदलें (Inkscape> फ़ाइल> दस्तावेज़ गुण)
    2. कार्य स्थान पर सभी ऑब्जेक्ट (Ctrl + A) का चयन करें और उन्हें नए पृष्ठ आकार में फिट करने के लिए आकार बदलें। (पहलू आकार रखने के लिए Ctrl दबाए रखें।)
  • .Svg फ़ाइल को .pdf में बदलने के लिए आप अपने लिए काम करने के लिए ऑनलाइन उपयोगिताओं को भी पा सकते हैं। यहाँ इस जवाब से एक उदाहरण है । इससे आपको .pdf आकार को आसानी से सेट करने की अनुमति का लाभ मिलता है।

आगे की पढाई


12

उन लोगों के लिए जो अभी भी अपडेट नहीं हुए हैं, Xcode 9 (iOS 11) में बदलाव हुए थे।

कोको टच में नया क्या है (WWDC 2017 सत्र 201) (@ 32: 55) https://developer.apple.com/videos/play/wwdc2017/201/

कुछ शब्दों में, एसेट कैटलॉग में अब नया चेकबॉक्स शामिल है, जिसमें "इंस्पेक्टर वेक्टर डेटा" नाम के इंस्पेक्टर इंस्पेक्टर शामिल हैं। जब जांच की जाती है, तो पीडीएफ डेटा को संकलित बाइनरी में शामिल किया जाएगा, जिससे इसका आकार बढ़ जाएगा। लेकिन यह दोनों दिशाओं में वेक्टर डेटा को स्केल करने और अच्छी छवियां प्रदान करने के लिए iOS के लिए एक मौका देता है। (अपनी कठिनाइयों के साथ)। 11 से नीचे के आईओएस के लिए, ऊपर की ओर जवाब में वर्णित पुराने स्केलिंग तंत्र का उपयोग किया जाता है।


1

आप अपने प्रोजेक्ट के अंदर सामान्य पीडीएफ फाइलों को वेक्टर इमेज के रूप में उपयोग कर सकते हैं और इस एक्सटेंशन का उपयोग करके किसी भी आकार की छवियां प्रदान कर सकते हैं। यह तरीका बेहतर है क्योंकि iOS आपकी पीडीएफ फाइलों में से .PNG छवियों को उत्पन्न नहीं करेगा, साथ ही आप उन छवियों को भी प्रस्तुत कर सकते हैं जो आप चाहते हैं:

    extension UIImage {

    static func fromPDF(filename: String, size: CGSize) -> UIImage? {
        guard let path = Bundle.main.path(forResource: filename, ofType: "pdf") else { return nil }
        let url = URL(fileURLWithPath: path)
        guard let document = CGPDFDocument(url as CFURL) else { return nil }
        guard let page = document.page(at: 1) else { return nil }

        let imageRect = CGRect(x: 0, y: 0, width: size.width, height: size.height)
        if #available(iOS 10.0, *) {
            let renderer = UIGraphicsImageRenderer(size: size)
            let img = renderer.image { ctx in
                UIColor.white.withAlphaComponent(0).set()
                ctx.fill(imageRect)
                ctx.cgContext.translateBy(x: 0, y: size.height)
                ctx.cgContext.scaleBy(x: 1.0, y: -1.0)
                ctx.cgContext.concatenate(page.getDrawingTransform(.artBox, rect: imageRect, rotate: 0, preserveAspectRatio: true))
                ctx.cgContext.drawPDFPage(page);
            }

            return img
        } else {
            // Fallback on earlier versions
            UIGraphicsBeginImageContextWithOptions(size, false, 2.0)
            if let context = UIGraphicsGetCurrentContext() {
                context.interpolationQuality = .high
                context.setAllowsAntialiasing(true)
                context.setShouldAntialias(true)
                context.setFillColor(red: 1, green: 1, blue: 1, alpha: 0)
                context.fill(imageRect)
                context.saveGState()
                context.translateBy(x: 0.0, y: size.height)
                context.scaleBy(x: 1.0, y: -1.0)
                context.concatenate(page.getDrawingTransform(.cropBox, rect: imageRect, rotate: 0, preserveAspectRatio: true))
                context.drawPDFPage(page)
                let image = UIGraphicsGetImageFromCurrentImageContext()
                UIGraphicsEndImageContext()
                return image
            }
            return nil
        }
    }

}

1
मैंने यह कोशिश की, लेकिन ऐसा नहीं लगता कि यह बड़े पिक्सेल आकार तक छवि को मापता है? UIImage ही मुझे मिल रहा है कि सही आकार है; यह सिर्फ इतना है कि वेक्टर छवि केंद्रित है और अभी भी पीडीएफ के मूल पिक्सेल आकार में है। (मैं इसे UIImage के आकार में स्केल करना चाहता था।) क्या आप जानते हैं कि क्या यह संभव होगा?
डिवाइडबीजेर 0
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.