2011-10-05 8 views
7

में अगर मैं एक NSImage की तरह कुछ के माध्यम से बनाने के लिए:चालू करने के लिए कोशिश कर रहा है [NSImage imageNamed: NSImageNameUser] NSData

NSImage *icon = [NSImage imageNamed:NSImageNameUser]; 

यह केवल एक प्रतिनिधित्व, एक NSCoreUIImageRep जो एक निजी वर्ग हो रहा है है।

मैं एक NSData के रूप में इस छवि को संग्रह करना चाहते हैं लेकिन अगर मैं TIFFRepresentation के लिए पूछना जब असली NSImage मैं मूल रूप से बनाया वेक्टर लग रहा था और अच्छी तरह से मेरी छवि विचारों को भरने के लिए पैमाने हैं मैं एक छोटे आइकन मिलता है।

मैं थोड़ी उम्मीद कर रहा था कि इस तरह से बनाई गई छवियां NSPDFImageRep मैं उपयोग कर सकूं।

कोई विचार मैं इस NSImage के NSData (वेक्टर संस्करण pref या किसी बड़े पैमाने पर बिटमैप संस्करण) कैसे प्राप्त कर सकता हूं?

अद्यतन

कुछ लोगों on Twitter साथ बात की और वे सुझाव दिया है कि इन छवियों का असली स्रोत बहु संकल्प फ़ाइलें icns (शायद सब पर सदिश नहीं) कर रहे हैं। मुझे डिस्क पर इन स्थानों का स्थान नहीं मिला लेकिन कम से कम सुनने के लिए दिलचस्प नहीं था।

इसके अतिरिक्त उन्होंने सुझाव दिया कि मैं सिस्टम एनएसआईमेज बनाएं और मैन्युअल रूप से इसे अपने उच्च रिजर्व एनएसआईमेज में प्रस्तुत करें। मैं अब यह कर रहा हूं और यह मेरी ज़रूरतों के लिए काम कर रहा है। मेरे कोड:

+ (NSImage *)pt_businessDefaultIcon 
{ 
    // Draws NSImageNameUser into a rendered bitmap. 
    // We do this because trying to create an NSData from 
    // [NSImage imageNamed:NSImageNameUser] directly results in a 32x32 image. 
    NSImage *icon = [NSImage imageNamed:NSImageNameUser]; 
    NSImage *renderedIcon = [[NSImage alloc] initWithSize:CGSizeMake(PTAdditionsBusinessDefaultIconSize, PTAdditionsBusinessDefaultIconSize)]; 
    [renderedIcon lockFocus]; 
    NSRect inRect = NSMakeRect(0, 0, PTAdditionsBusinessDefaultIconSize, PTAdditionsBusinessDefaultIconSize); 
    NSRect fromRect = NSMakeRect(0, 0, icon.size.width, icon.size.width);; 
    [icon drawInRect:inRect fromRect:fromRect operation:NSCompositeCopy fraction:1.0]; 
    [renderedIcon unlockFocus]; 

    return renderedIcon; 
} 

, (? मेरा उत्तर के रूप में पोस्ट करने की कोशिश की, लेकिन मैं पर्याप्त प्रतिष्ठा नहीं है)

+0

आपका प्रश्न मेरे लिए उपयोगी था, और आपका उत्तर काम करता था। – Guillaume

उत्तर

4

आप प्रलेखन को अनदेखा कर रहे हैं। आपके दोनों प्रमुख प्रश्नों का उत्तर दिया गया है। Cocoa Drawing Guide (एनएसआईमेज एपीआई संदर्भ से जुड़े साथी गाइड) में एक छवि अनुभाग है जिसमें आपको वास्तव में अच्छी तरह से पढ़ने की आवश्यकता है और जब भी आपके पास रिप/कैशिंग/साइजिंग/गुणवत्ता के मुद्दे हैं तो देखें।

... अगर मैं TIFFRepresentation के लिए पूछना मैं एक छोटा सा आइकन जब असली NSImage मैं मूल रूप से बनाया वेक्टर लग रहा था और पैमाने ऊपर मेरी छवि विचारों अच्छी तरह से भरने के लिए होगा मिलता है।

इस प्रश्न के लिए छवियों अनुभाग के प्रासंगिक उपखंड हैं: कैसे एक छवि प्रतिनिधित्व चुना गया है, छवियों और कैशिंग, और छवि आकार और संकल्प। डिफ़ॉल्ट रूप से, एक टीआईएफएफ छवि के लिए -cacheMode "Behaves जैसे NSImageCacheBySize सेटिंग प्रभावी थी।" इसके अलावा, इन-मेमोरी स्केलिंग/साइजिंग ऑपरेशंस के लिए, -इमेजइंटरपोलेशन महत्वपूर्ण है: "तालिका 6-4 उपलब्ध इंटरपोलेशन सेटिंग्स सूचीबद्ध करती है।" और "एनएसआईमेजइंटरपोलेशन हाई - धीमी, उच्च गुणवत्ता वाली इंटरपोलेशन।"

मैं निश्चित रूप से निश्चित हूं कि यह एक नामित सिस्टम छवि के साथ-साथ किसी अन्य पर भी लागू होता है।

मैं थोड़े एक NSPDFImageRep मैं इस्तेमाल कर सकते हैं के लिए होता है [डिस्क से एक छवि लोड करके] बनाया छवियों उम्मीद कर रही थी।

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

आपको वह प्रतिनिधित्व मिलता है जो लोड की गई छवि के अनुरूप है। उदाहरण के लिए, आपको टीआईएफएफ छवि के लिए पीडीएफ प्रस्तुतिकरण बनाना होगा। उच्च रिज़ॉल्यूशन पर ऐसा करने के लिए, आपको कैशिंग मोड पर वापस जाना होगा ताकि आप उच्च-रेज आइटम प्राप्त कर सकें।

छवियों/निर्माण तंत्र/सेटिंग्स/और आप इसके साथ क्या करना चाहते हैं, इसकी उच्च संख्या की क्रमिकता के कारण सूची में बहुत अधिक संख्या के लॉट हैं। मेरी पोस्ट आपकी स्थिति के लिए आवश्यक विशिष्ट जानकारी खोजने की दिशा में एक सामान्य मार्गदर्शिका है।

अधिक जानकारी के लिए, विशिष्ट विवरण जोड़ें: जिस कोड का आप उपयोग करने का प्रयास करते हैं, उस छवि का प्रकार जिसे आप लोड या बना रहे हैं - आपको अपने चौथे अनुच्छेद में दो अलग-अलग संभावनाओं का उल्लेख करना प्रतीत होता है - और क्या गलत हुआ।

+0

जानकारी और दस्तावेज़ीकरण लिंक के लिए धन्यवाद। एनएसआईमेज को संग्रहीत करने के दौरान मैं वास्तव में उस पर नहीं आया था। – zorn

0

मुझे लगता है कि होता है कि छवि किसी भी तरह "हार्ड वायर्ड" ग्राफिक्स प्रणाली में है और इसका एनएसआईमेज प्रतिनिधित्व केवल एक संख्या है जो इंगित करता है कि यह हार्ड-वायर्ड ग्राफ़िक है। तो संभव है कि आपको इसे आकर्षित करने के लिए क्या करना है और फिर ड्राइंग को कैप्चर करना है।

बहुत आम तौर पर, एक दृश्य नियंत्रक कि छवि प्रस्तुत करना होगा बनाने के संदर्भ कुलपति view संपत्ति पैदा करने के लिए दृश्य प्रदान करने, निकालने कुलपति की contentView, contentView.layer मिलता है, एक UIGraphics संदर्भ में प्रस्तुत करना layer, मिल संदर्भ से UIImage, UIImage से जो भी प्रतिनिधित्व आप चाहते हैं उसे निकालें।

(एक सरल तरीका हो सकता है, लेकिन यह एक मैं एक मामले में का उपयोग कर समाप्त हो गया है।)

(और, आह, मुझे लगता है इस योजना या तो स्केलिंग की रक्षा नहीं करता है।)

+0

दुर्भाग्य से आपका स्केलिंग प्रवेश बिल्कुल सही है। यह एक सार्वभौमिक समाधान नहीं है। वास्तव में, तथ्यों के लिए कोई सार्वभौमिक समाधान नहीं है। यह इस बात पर निर्भर करता है कि छवि कैसे बनाई गई है (स्मृति में या डिस्क से लोड), इसकी कैशिंग और इंटरपोलेशन सेटिंग्स क्या हैं, और क्या मौजूदा प्रतिनिधित्व (ओं) को स्केल किया जा सकता है या वांछित आकार/गुणवत्ता। –