gpt4 book ai didi

objective-c - 将未显示的 NSViewController 导出为 JPG

转载 作者:行者123 更新时间:2023-12-03 17:50:52 25 4
gpt4 key购买 nike

我正在开发一个桌面应用程序,该应用程序从未显示的 NSViewController 生成图像。生成的 View 有 3 个 NSImageViews,一旦创建就会更改内容。

我设法将NSViewController的 View 导出为JPG文件,但它永远不会在提供给NSImageView的图像中呈现,它保留在 Nib 中设置的图像。另外,如果我没有将背景颜色设置为 View 的图层...我会得到一个空结果。

我在这里缺少什么?我想我需要更新 NSViewController 的 View ......但我该怎么做呢?我不想显示我的 NSViewController。

我的代码:

- (IBAction)doExport:(id)sender {
ExportView *view = [[ExportView alloc] initWithNibName:@"ExportView" bundle:nil];
[view.pic1 setImage:self.pic1.image];
[view.pic2 setImage:self.pic2.image];
[view.pic3 setImage:self.pic3.image];
[view.icon setImage:self.icon.image];

// Hardcoding for test
[view.pic1 setImage:[NSImage imageNamed:@"iPhone 4-Inch Screenshot 1"]];
[view.pic1 setNeedsLayout:YES];
[view.pic1 setNeedsDisplay];
[view.pic1 updateLayer];

// Setup the image to render
NSRect imgRect = view.view.frame;
NSSize imgSize = imgRect.size;

NSBitmapImageRep *rep = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:NULL
pixelsWide:imgSize.width
pixelsHigh:imgSize.height
bitsPerSample:8
samplesPerPixel:4
hasAlpha:YES
isPlanar:NO
colorSpaceName:NSDeviceRGBColorSpace
bitmapFormat:NSAlphaFirstBitmapFormat
bytesPerRow:0
bitsPerPixel:0];

NSGraphicsContext *g = [NSGraphicsContext graphicsContextWithBitmapImageRep:rep];
[NSGraphicsContext saveGraphicsState];
[NSGraphicsContext setCurrentContext:g];

// Set view background color
CALayer *viewLayer = [CALayer layer];
[viewLayer setBackgroundColor:[NSColor clearColor].CGColor];
[view.view setWantsLayer:YES];
[view.view setLayer:viewLayer];

// Render
CGContextRef zCgContextRef = (CGContextRef) [g graphicsPort];
[[view.view layer] renderInContext:zCgContextRef];

// Render pic as well, for test
[view.pic1.layer renderInContext:zCgContextRef];

// Get the Data for the image
NSData *exportedData = [rep representationUsingType:NSJPEGFileType properties:nil];

// Start the savepanel
NSSavePanel *savepanel = [NSSavePanel savePanel];
savepanel.title = @"Save chart";

[savepanel setAllowedFileTypes:[NSArray arrayWithObject:@"jpg"]];

[savepanel beginSheetModalForWindow:self.window completionHandler:^(NSInteger result)
{
if (NSFileHandlingPanelOKButton == result)
{
NSURL* fileURL = [savepanel URL];

if ([fileURL.pathExtension isEqualToString:@""])
fileURL = [fileURL URLByAppendingPathExtension:@"jpg"];

[exportedData writeToURL:fileURL atomically:YES];
}
}];
}

最佳答案

我用一种非常丑陋的方式解决了这个问题。基本上我所做的就是将 View 添加到我的 contentView 中,并立即将 setHidden 设置为 YES 。这将初始化 View 。现在我更改 Nib View 的内容。当需要将数据渲染到 NSData 时,我将 setHidden 更改为 NO,生成 NSData,然后删除看法。

最终结果(没有漂亮的代码:( ):

- (IBAction)doExport:(id)sender {
ExportView *view = [[ExportView alloc] initWithNibName:@"ExportView" bundle:nil];
[view.view setHidden:YES];
[self.window.contentView addSubview:view.view];

[view.pic1 setImage:self.pic1.image];
[view.pic2 setImage:self.pic2.image];
[view.pic3 setImage:self.pic3.image];
[view.icon setImage:self.icon.image];

// Setup the image to render
NSRect imgRect = view.view.frame;
NSSize imgSize = imgRect.size;

NSBitmapImageRep *rep = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:NULL
pixelsWide:imgSize.width
pixelsHigh:imgSize.height
bitsPerSample:8
samplesPerPixel:4
hasAlpha:YES
isPlanar:NO
colorSpaceName:NSDeviceRGBColorSpace
bitmapFormat:NSAlphaFirstBitmapFormat
bytesPerRow:0
bitsPerPixel:0];

NSGraphicsContext *g = [NSGraphicsContext graphicsContextWithBitmapImageRep:rep];
[NSGraphicsContext saveGraphicsState];
[NSGraphicsContext setCurrentContext:g];

// Set view background color
CALayer *viewLayer = [CALayer layer];
[viewLayer setBackgroundColor:[NSColor clearColor].CGColor];
[view.view setWantsLayer:YES];
[view.view setLayer:viewLayer];

[view.view setHidden:NO];

// Render
CGContextRef zCgContextRef = (CGContextRef) [g graphicsPort];
[[view.view layer] renderInContext:zCgContextRef];

[view.view removeFromSuperview];

// Get the Data for the image
NSData *exportedData = [rep representationUsingType:NSJPEGFileType properties:nil];

// Start the savepanel
NSSavePanel *savepanel = [NSSavePanel savePanel];
savepanel.title = @"Save chart";

[savepanel setAllowedFileTypes:[NSArray arrayWithObject:@"jpg"]];
[savepanel setNameFieldStringValue:@"Test"];

[savepanel beginSheetModalForWindow:self.window completionHandler:^(NSInteger result)
{
if (NSFileHandlingPanelOKButton == result)
{
NSURL* fileURL = [savepanel URL];

if ([fileURL.pathExtension isEqualToString:@""])
fileURL = [fileURL URLByAppendingPathExtension:@"jpg"];

[exportedData writeToURL:fileURL atomically:YES];
}
}];
}

关于objective-c - 将未显示的 NSViewController 导出为 JPG,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27168100/

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