2012-07-07 5 views
6

मेरे पास कोको एप्लिकेशन में ऑफ स्क्रीन एनएसवीव्स का अनुक्रम है, जिसका उपयोग प्रिंटिंग के लिए पीडीएफ लिखने के लिए किया जाता है। विचार एनएसविंडो में नहीं हैं, या किसी भी तरह से दिखाई देते हैं।ऑफ़-स्क्रीन एनएसवी व्यू से स्केल की गई छवि जेनरेट करें

मैं उस दृश्य की थंबनेल छवियां उत्पन्न करने में सक्षम होना चाहता हूं, ठीक उसी तरह पीडीएफ देखेंगे, लेकिन एक निश्चित पिक्सेल आकार (चौड़ाई या ऊंचाई तक सीमित) फिट करने के लिए नीचे स्केल किया गया है। इसे जितनी जल्दी हो सके, इसलिए मैं पीडीएफ को प्रतिपादन से बचने के लिए, फिर रास्टर और स्केलिंग में परिवर्तित करना चाहता हूं - मैं सीधे रास्टर पर जाना चाहता हूं।

पल मैं कर रहा हूँ में:

NSBitmapImageRep *bitmapImageRep = [pageView bitmapImageRepForCachingDisplayInRect:pageView.bounds]; 
[pageView cacheDisplayInRect:pageView.bounds toBitmapImageRep:bitmapImageRep]; 
NSImage *image = [[NSImage alloc] initWithSize:bitmapImageRep.size]; 
[image addRepresentation:bitmapImageRep]; 

यह दृष्टिकोण अच्छी तरह से काम कर रहा है, लेकिन मैं बाहर काम नहीं कर सकते कि bitmapImageRep प्रतिपादन से पहले NSView करने के लिए एक स्केलिंग लागू करने के लिए। मैं scaleUnitSquareToSize का उपयोग करने से बचना चाहता हूं, क्योंकि जैसा कि मैं इसे समझता हूं, केवल एनएसवी व्यू के फ्रेम की सीमाओं को ही बदलता है।

ऐसा करने के सर्वोत्तम तरीके पर कोई सुझाव?

उत्तर

6

यही वह है जो मैंने पूरा किया, जो पूरी तरह से काम करता है। हम सीधे NSBitmapImageRep में आकर्षित करते हैं, लेकिन संदर्भ को स्पष्ट रूप से CGContextScaleCTM का उपयोग करके स्केल करते हैं। graphicsContext.graphicsPort आपको NSGraphicsContext के लिए CGContextRef पर हैंडल देता है।

NSView *pageView = [self viewForPageIndex:pageIndex]; 

float scale = width/pageView.bounds.size.width; 
float height = scale * pageView.bounds.size.height; 

NSRect targetRect = NSMakeRect(0.0, 0.0, width, height); 
NSBitmapImageRep *bitmapRep; 

bitmapRep = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:nil 
                pixelsWide:targetRect.size.width 
                pixelsHigh:targetRect.size.height 
               bitsPerSample:8 
               samplesPerPixel:4 
                 hasAlpha:YES 
                 isPlanar:NO 
               colorSpaceName:NSCalibratedRGBColorSpace 
                bitmapFormat:0 
                bytesPerRow:(4 * targetRect.size.width) 
                bitsPerPixel:32]; 

[NSGraphicsContext saveGraphicsState]; 

NSGraphicsContext *graphicsContext = [NSGraphicsContext graphicsContextWithBitmapImageRep:bitmapRep]; 
[NSGraphicsContext setCurrentContext:graphicsContext]; 
CGContextScaleCTM(graphicsContext.graphicsPort, scale, scale); 

[pageView displayRectIgnoringOpacity:pageView.bounds inContext:graphicsContext]; 

[NSGraphicsContext restoreGraphicsState]; 

NSImage *image = [[NSImage alloc] initWithSize:bitmapRep.size]; 
[image addRepresentation:bitmapRep]; 

return image; 
+0

मैं 'bitmapImageRepForCacheDisplayInRect:' और 'cacheDisplayInRect: toBitmapImageRep: 'गतिशील रूप से लॉन्च पर नोटबुक ऐप के लिए थंबनेल जेनरेट करने के लिए उपयोग कर रहा था। 40 पृष्ठों (परत-होस्टेड एनएसवीव्स) के साथ कई दृश्य सामग्री के साथ, थंबनेल जेनरेट करने में 90 सेकंड लग रहे थे। यह मैकोज़ के पिछले संस्करणों में नहीं था। मैंने 1.0 के पैमाने का उपयोग करके उपरोक्त @ टॉमटाइलर के दृष्टिकोण के साथ इस विधि को प्रतिस्थापित किया है (क्योंकि मुझे थंबनेल की पूर्ण आकार में तरल रूप से ऊपर की तरफ स्केल करने की आवश्यकता है) और थंबनेल पीढ़ी लगभग आधा वर्चुअल मेमोरी उपयोग के साथ 20 सेकंड (पृष्ठभूमि) तक गिर गई है! – Dalmazio

0

कैसे scaleUnitSquareToSize: का उपयोग कर और फिर bitmapImageRepForCachingDisplayInRect: और cacheDisplayInRect:toBitmapImageRep: करने के लिए एक छोटे रेक्ट में गुजर के बारे में?

तो, यदि आप इसे 2 के कारक से घटाते हैं, तो आप सीमाओं और ऊंचाई के साथ आधे हिस्से के साथ एक आयत पारित करेंगे।

+0

मैं कोस्टो टेक्स्ट लेआउट सिस्टम का उपयोग कर रहा हूं, साथ ही NSTextContainer के साथ। जैसा कि मैं इसे समझता हूं, यह एनएसवी व्यू स्तर पर ही संभव है। – tomtaylor

+0

आह, क्षमा करें, मुझे गलत समझा गया। मैंने सोचा था कि आप एक पीडीएफ प्रदर्शित कर रहे थे, लेकिन आप मौजूदा विचारों से * पीडीएफ बना रहे हैं। –

+0

मैंने कुछ नए सुझाव दिए हैं; मुझे लगता है कि आपकी योजना समझ में आता है। आप परत परत वाले दृश्य का उपयोग करके और उस परत पर एक परिवर्तन का उपयोग करने का भी प्रयास कर सकते हैं। (मैं आईओएस के लिए अधिक उपयोग किया जाता हूं, जहां यह करने के लिए प्राकृतिक चीज होगी।) –

संबंधित मुद्दे