gpt4 book ai didi

objective-c - 从离屏 NSView 生成缩放图像

转载 作者:太空狗 更新时间:2023-10-30 03:43:28 26 4
gpt4 key购买 nike

我在 Cocoa 应用程序中有一系列屏幕外的 NSView,用于编写 PDF 以供打印。这些 View 不在 NSWindow 中,也不以任何方式可见。

我希望能够生成该 View 的缩略图,与 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 的框架。

关于执行此操作的最佳方法有什么建议吗?

最佳答案

这就是我最终做的,效果很好。我们直接绘制到 NSBitmapImageRep 中,但事先使用 CGContextScaleCTM 显式缩放上下文。 graphicsContext.graphicsPort 为您提供 NSGraphicsContextCGContextRef 句柄。

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;

关于objective-c - 从离屏 NSView 生成缩放图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11377293/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com