gpt4 book ai didi

cocoa - 如何将 NSImageView 图层保存为磁盘上的 PNG 格式?

转载 作者:行者123 更新时间:2023-12-03 17:06:00 24 4
gpt4 key购买 nike

我正在尝试执行以下批处理:

  1. 加载图像
  2. 缩放
  3. 为其添加圆角边框
  4. 保存新的 PNG 图像

到目前为止,我想出了这个:

CGPoint center = CGPointMake(self.window.frame.size.width / 2., self.window.frame.size.height / 2.);
[[NSGraphicsContext currentContext] setImageInterpolation:NSImageInterpolationHigh];
NSImage * newThumbnail = [[NSImage alloc] initWithData:[NSData dataWithContentsOfURL:[files objectAtIndex:0]]];
NSImageView *imageView = [[NSImageView alloc] initWithFrame:CGRectMake(center.x - (57/2.), center.y - (80/2.), 57, 80)];
[imageView setWantsLayer:YES];

imageView.layer.borderColor = [[NSColor blackColor] CGColor];
imageView.layer.cornerRadius = 4;
imageView.layer.masksToBounds = YES;
imageView.layer.borderWidth = 1.0;
imageView.image = newThumbnail;

现在我想我错过了告诉图层重新渲染到某些上下文?也许类似于 [imageView.layer drawInContext: some context (NS o CG?)]; 并将该上下文保存到磁盘。但我很困惑:

什么上下文,

是否从上下文到NSData到磁盘,

或者如果我在保存之前需要某个中间图像。

基本上,在 CALayers 和 CGLayers 以及 NS 对象和 UI 对象之间(我知道我在 OS X Cocoa 中,它不是 UIKit 并且到目前为止我也没有使用 CG 东西)我不知道如何将以上转为 png。

最佳答案

您根本不应该使用 View ,因为您不需要显示到屏幕上。您应该使用屏幕外位图(NSBitmapImageRep)并使用绘图命令来绘制图像。

在 Cocoa 中绘图有两种选择。最简单的方法是使用各种 Cocoa 绘图类,例如 NSBezierPath 等。另一种选择是更强大但也更底层和复杂的 Quartz API,它们不是面向对象的,而是使用 C 函数语法。

以下是如何使用 Cocoa 绘图执行您想要的操作的示例:

NSImage* anImage = [NSImage imageNamed:@"Lenna.tiff"]; //or some other source

//create a bitmap at a specific size
NSRect offscreenRect = NSMakeRect(0.0, 0.0, 250.0, 250.0);
NSBitmapImageRep* bitmap = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:nil
pixelsWide:offscreenRect.size.width
pixelsHigh:offscreenRect.size.height
bitsPerSample:8
samplesPerPixel:4
hasAlpha:YES
isPlanar:NO
colorSpaceName:NSCalibratedRGBColorSpace
bitmapFormat:0
bytesPerRow:(4 * offscreenRect.size.width)
bitsPerPixel:32];

//save the current graphics context and lock focus on the bitmap
NSGraphicsContext* originalContext = [NSGraphicsContext currentContext];
[NSGraphicsContext setCurrentContext:[NSGraphicsContext
graphicsContextWithBitmapImageRep:bitmap]];
[NSGraphicsContext saveGraphicsState];

//clear the image rep. This is faster than filling with [NSColor clearColor].
unsigned char *bitmapData = [bitmap bitmapData];
if (bitmapData)
bzero(bitmapData, [bitmap bytesPerRow] * [bitmap pixelsHigh]);

//create the border path
CGFloat borderWidth = 2.0;
CGFloat cornerRadius = 14.0;
NSRect borderRect = NSInsetRect(offscreenRect, borderWidth/2.0, borderWidth/2.0);
NSBezierPath* border = [NSBezierPath bezierPathWithRoundedRect:borderRect xRadius:cornerRadius yRadius:cornerRadius];
[border setLineWidth:borderWidth];

//set the border as a clipping path
[NSGraphicsContext saveGraphicsState];
[border addClip];

//scale and draw the image
[anImage setSize:offscreenRect.size];
[anImage drawAtPoint:NSZeroPoint fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0];
[NSGraphicsContext restoreGraphicsState];

//set the border color
[[NSColor blackColor] set];

//draw the border
[border stroke];

//restore the original graphics context
[NSGraphicsContext restoreGraphicsState];
[NSGraphicsContext setCurrentContext:originalContext];

//get PNG data from the image rep
NSData* pngData = [bitmap representationUsingType:NSPNGFileType properties:nil];
NSError* error;
if(![pngData writeToURL:[NSURL fileURLWithPath:[NSHomeDirectory() stringByAppendingPathComponent:@"test.png"]] options:NSDataWritingAtomic error:&error])
{
NSLog(@"%@",error);
}

关于cocoa - 如何将 NSImageView 图层保存为磁盘上的 PNG 格式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8284746/

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