2012-07-07 32 views
6

Yazdırma için bir PDF oluşturmak için kullanılan bir Kakao uygulamasındaki NSViews kapalı ekran dizilim var. Görünümler bir NSWindow'da veya herhangi bir şekilde görünür değildir.Ekrandan ölçeklendirilmiş görüntü üretin NSView

Tam olarak PDF'nin göründüğü, ancak belirli bir piksel boyutuna (genişlik veya yükseklikle sınırlandırılmış) sığacak şekilde küçültülmüş bu görünümün küçük resimlerini oluşturmak istiyorum. Bu, olabildiğince hızlı olmalı, bu yüzden PDF'ye görüntülemekten kaçınmak, sonra raster ve ölçeklemeye dönüştürmek istiyorum - rastere doğrudan gitmek istiyorum. Ben yapıyorum anda

: Bu yaklaşım iyi çalışıyor, ama bitmapImageRep oluşturma işlemi öncesinde NSView bir ölçeklendirme nasıl uygulanacağını dışarı çalışamaz

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

. scaleUnitSquareToSize'u kullanmaktan kaçınmak istiyorum çünkü bunu anladığım kadarıyla NSView çerçevesini değil, sadece sınırları değiştiriyor.

Bunu yapmanın en iyi yolu hakkında herhangi bir öneriniz var mı?

cevap

6

Yaptığım işte bu, mükemmel bir şekilde çalışıyor. Doğrudan bir NSBitmapImageRep'a çiziyoruz, ancak içeriği daha önce CGContextScaleCTM kullanarak açık bir şekilde ölçeklendiriyoruz. graphicsContext.graphicsPort, NSGraphicsContext için CGContextRef üzerindeki tanıtımı verir.

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

Başlatıldığında bir dizüstü bilgisayar uygulaması için dinamik olarak küçük resimler oluşturmak üzere 'bitmapImageRepForCacheDisplayInRect:' ve 'cacheDisplayInRect: toBitmapImageRep:' kullanıyordum. Çok sayıda görsel içeriğe sahip 40 sayfalık (katman barındırılan NSView'ler) ile, küçük resimler oluşturmak 90 saniyeye yaklaşıyordu. Bu, önceki macOS sürümlerinde geçerli değildi. Ben bu yöntemi @ tomtaylor'un yaklaşımıyla, 1.0'lık bir ölçek kullanarak (tam boyuta doğru yukarı doğru ölçeklendirmek için küçük resimlere ihtiyacım var) ve küçük resim neslinin 20 saniyeliğine (arka plan) düştüğünden, sanal bellek kullanımının yaklaşık yarısı ile değiştirdim! – Dalmazio

0

scaleUnitSquareToSize:'u kullanma ve daha sonra bitmapImageRepForCachingDisplayInRect: ve cacheDisplayInRect:toBitmapImageRep: için daha küçük bir doğrultuda nasıl geçirilir?

Yani, eğer 2 katına kadar küçültüyorsanız, sınırlarla ve yükseklikte yarıya kadar bir rect ileteceksiniz.

+0

NSTextContainer ile birlikte Kakao Metin Düzenleme Sistemini kullanıyorum. Anladığım kadarıyla, bu sadece NSView seviyesinde mümkün. – tomtaylor

+0

Ah, üzgünüm, yanlış anladım. Bir PDF görüntülediğinizi düşündüm, ancak * mevcut görünümlerden * bir PDF oluşturuyorsunuz. –

+0

Bazı yeni önerilerde bulundum; Bence planın mantıklı. Katman destekli bir görünüm kullanmayı ve bu katmandaki bir dönüşümü kullanmayı deneyebilirsiniz. (IOS için daha çok kullanıyorum, bunun yapılması gereken doğal bir şey olurdu.) –