में मल्टीपाज टीआईएफएफ एनएसआईमेज का स्वचालित स्केलिंग समस्या: मेरे पास एक बहुआयामी टीआईएफएफ छवि है (टिफुटिल के साथ उत्पन्न) जिसमें 256x128 पीएक्स से कई पिक्सल आयाम पर एक ही छवि 4096x2048 पीएक्स तक होती है। मैं इस छवि को CALayer
में प्रदर्शित करना चाहता हूं ताकि सिस्टम स्वचालित रूप से परत के आकार के आधार पर छवि का सबसे अच्छा प्रतिनिधित्व चुनता हो। फिलहाल, परत हमेशा आकार के 256x128 प्रस्तुति का उपयोग करती है, चाहे उसका आकार चाहे।एक कैलियर
यहाँ मैं क्या करना है: मैं
NSImage *image = [NSImage imageNamed:@"map-multipage.tiff"];
लॉगिंग image
वस्तु के साथ छवि को लोड पुष्टि की है कि यह अलग पिक्सेल आकार के अनेक अभ्यावेदन शामिल है, लेकिन सभी अभ्यावेदन अंक (256x128) में एक ही आकार के होते हैं। AFAIK इस प्रकार ऐप्पल बहु-रिज़ॉल्यूशन छवियों का निर्माण करने की सिफारिश करता है।
NSLog(@"%@", image);
<NSImage 0x100623060 Name=map-multipage Size={256, 128} Reps=(
"NSBitmapImageRep 0x10064d330 Size={256, 128} ColorSpace=(not yet loaded) BPS=8 BPP=(not yet loaded) Pixels=256x128 Alpha=NO Planar=NO Format=(not yet loaded) CurrentBacking=nil (faulting) CGImageSource=0x10014fdb0",
"NSBitmapImageRep 0x10064e1b0 Size={256, 128} ColorSpace=(not yet loaded) BPS=8 BPP=(not yet loaded) Pixels=512x256 Alpha=NO Planar=NO Format=(not yet loaded) CurrentBacking=nil (faulting) CGImageSource=0x10014fdb0",
...
"NSBitmapImageRep 0x100530bd0 Size={256, 128} ColorSpace=(not yet loaded) BPS=8 BPP=(not yet loaded) Pixels=4096x2048 Alpha=NO Planar=NO Format=(not yet loaded) CurrentBacking=nil (faulting) CGImageSource=0x10014fdb0"
)>
मैं तो परत की contents
संपत्ति को सीधे NSImage
उदाहरण आवंटित:
self.layerView.layer.contents = image;
के रूप में उल्लेख किया है, परिणाम यह हुआ कि परत छवि प्रदर्शित करने के लिए पहले प्रतिनिधित्व (256x128 पिक्सल) का उपयोग करता है, भले ही अंक या पिक्सेल में परत के आकार का।
जब मैं एक ही छवि को NSImageView
पर असाइन करता हूं, तो यह अपेक्षा के अनुसार काम करता है। छवि दृश्य पारदर्शी रूप से इसके आकार के आधार पर सर्वश्रेष्ठ छवि प्रतिनिधित्व का चयन करता है। मुझे उम्मीद है कि CALayer
वैसे ही काम करेगा लेकिन स्पष्ट रूप से यह मामला नहीं है। क्या कोई पुष्टि कर सकता है कि CALayer
इस स्वचालित चयन का समर्थन नहीं करता है या मैं कुछ गलत कर रहा हूं?
(ध्यान दें कि यह प्रश्न सीधे हायडीपीआई/रेटिना ग्राफिक्स से संबंधित नहीं है। वास्तव में, यदि मैं परत को हायडीपीआई मोड में एक डिस्प्ले पर ले जाता हूं, तो यह थोड़ा तेज प्रस्तुत करता है, यह दर्शाता है कि अब यह दूसरा बिटमैप प्रतिनिधित्व का उपयोग करता है (512x256 पिक्सल) प्रतिपादन के लिए। यह पता चलता है कि स्वचालन एक HiDPI प्रदर्शन काम करता है पर एक उच्च संकल्प का चयन करने, जबकि सबसे अच्छा बिटमैप प्रतिनिधित्व के मौलिक चयन विफल रहता है।)
बस एक विचार, '@tiff' को' -t "map-multipage.tiff" में हटाने का प्रयास करें। साथ ही, सुनिश्चित करें कि 'layerContentsRedrawPolicy' 'Never' नहीं है। या शायद परत की 'सामग्री गुरुत्वाकर्षण' प्रभावित करती है कि इसकी सामग्री को कैसे अपडेट किया जा रहा है? – Stream
@ स्ट्रीम: सुझावों के लिए बहुत बहुत धन्यवाद। नहीं, फ़ाइल एक्सटेंशन को हटाने का कोई प्रभाव नहीं पड़ता है, न ही 'layerContentsRedrawPolicy' या' ContentGravity' के साथ खेलता है। कल रात डब्ल्यूडब्ल्यूडीसी 2012 सत्र 245 देखकर, मुझे संदेह है कि मेरे प्रश्न का उत्तर यह है कि यह इस तरह से काम नहीं करता है। ऐसा लगता है कि 'कैलियर' की 'सामग्री' परत/वास्तविक पिक्सेल में वास्तविक आकार के बारे में कुछ भी नहीं जानता है और इसलिए इस जानकारी के आधार पर बिटमैप प्रतिनिधित्व का चयन नहीं कर सकता है। –
समझ में आता है! '- [कैलियर सामग्री] 'सिर्फ एक बिटमैप है, इसके स्रोत के बारे में कुछ भी जानने के लिए" गूंगा "है। यह 'कैलियर' है जो 'drawRect: inContext: 'के माध्यम से प्रतिनिधित्व पर निर्भर करता है। इसलिए, जब आप सीधे 'सामग्री' सेट करते हैं, तो इसका आयाम वर्तमान '- [NSImage आकार] 'पर आधारित होना चाहिए। – Stream