6

我在 Cocoa 应用程序中有一系列屏幕外 NSView,它们用于编写 PDF 以进行打印。视图不在 NSWindow 中,或以任何方式可见。

我希望能够生成该视图的缩略图,就像 PDF 看起来一样,但按比例缩小以适合某个像素大小(限制为宽度或高度)。这需要尽可能快,所以我想避免渲染为 PDF,然后转换为光栅和缩放 - 我想直接转到光栅。

目前我正在做:

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,因为据我了解,它只会改变边界,而不是 NSView 的框架。

关于这样做的最佳方法有什么建议吗?

4

2 回答 2

6

这就是我最终做的,效果很好。我们直接绘制到 中,但事先NSBitmapImageRep显式地缩放上下文。为您提供.CGContextScaleCTMgraphicsContext.graphicsPortCGContextRefNSGraphicsContext

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;
于 2012-07-08T15:48:48.760 回答
0

使用scaleUnitSquareToSize:然后将较小的矩形传递给bitmapImageRepForCachingDisplayInRect:andcacheDisplayInRect:toBitmapImageRep:怎么样?

因此,如果您将其缩小 2 倍,您将传递一个带有边界和高度的半边矩形。

于 2012-07-07T17:58:57.810 回答