gpt4 book ai didi

iOS 到 Mac GraphicContext 解释/转换

转载 作者:技术小花猫 更新时间:2023-10-29 10:29:58 27 4
gpt4 key购买 nike

我已经在 iOS 上编程了两年,从未在 Mac 上编程。我正在开发一个小实用程序来处理我在 iOS 开发中遇到的一些简单图像需求。无论如何,我在 iOS 中有运行完美的工作代码,但我完全不知道 mac 有什么等价物。

我已经尝试了很多不同的东西,但我真的不明白如何在“drawRect:”方法之外的 Mac 上启动图形上下文。在 iPhone 上,我只使用 UIGraphicsBeghinImageContext()。我知道其他帖子说要使用 lockFocus/unlockFocus,但我不确定如何准确地满足我的需要。哦,我真的很想念 UIImage 的“CGImage”属性。我不明白为什么 NSImage 不能有一个,尽管它听起来比这更棘手。

这是我在 iOS 上的工作代码——基本上它只是从蒙版创建一个反射图像并将它们组合在一起:

    UIImage *mask = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle]pathForResource:@"Mask_Image.jpg" ofType:nil]];
UIImage *image = [UIImage imageNamed::@"Test_Image1.jpg"];
UIGraphicsBeginImageContextWithOptions(mask.size, NO, [[UIScreen mainScreen]scale]);
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextTranslateCTM(ctx, 0.0, mask.size.height);
CGContextScaleCTM(ctx, 1.f, -1.f);
[image drawInRect:CGRectMake(0.f, -mask.size.height, image.size.width, image.size.height)];
UIImage *flippedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

CGImageRef maskRef = mask.CGImage;
CGImageRef maskCreate = CGImageMaskCreate(CGImageGetWidth(maskRef),
CGImageGetHeight(maskRef),
CGImageGetBitsPerComponent(maskRef),
CGImageGetBitsPerPixel(maskRef),
CGImageGetBytesPerRow(maskRef),
CGImageGetDataProvider(maskRef), NULL, false);
CGImageRef masked = CGImageCreateWithMask([flippedImage CGImage], maskCreate);

CGImageRelease(maskCreate);

UIImage *maskedImage = [UIImage imageWithCGImage:masked];
CGImageRelease(masked);

UIGraphicsBeginImageContextWithOptions(CGSizeMake(image.size.width, image.size.height + (image.size.height * .5)), NO, [[UIScreen mainScreen]scale]);

[image drawInRect:CGRectMake(0,0, image.size.width, image.size.height)];
[maskedImage drawInRect:CGRectMake(0, image.size.height, maskedImage.size.width, maskedImage.size.height)];

UIImage *anotherImage = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

//do something with anotherImage

对于在 Mac 上(简单地)实现这一点有什么建议吗?

最佳答案

这是一个将蓝色圆圈绘制到 NSImage 中的简单示例(我在此示例中使用的是 ARC,添加保留/释放以供品尝)

NSSize size = NSMakeSize(50, 50);

NSImage* im = [[NSImage alloc] initWithSize:size];
NSBitmapImageRep* rep = [[NSBitmapImageRep alloc]
initWithBitmapDataPlanes:NULL
pixelsWide:size.width
pixelsHigh:size.height
bitsPerSample:8
samplesPerPixel:4
hasAlpha:YES
isPlanar:NO
colorSpaceName:NSCalibratedRGBColorSpace
bytesPerRow:0
bitsPerPixel:0];

[im addRepresentation:rep];

[im lockFocus];

CGContextRef ctx = [[NSGraphicsContext currentContext] graphicsPort];
CGContextClearRect(ctx, NSMakeRect(0, 0, size.width, size.height));
CGContextSetFillColorWithColor(ctx, [[NSColor blueColor] CGColor]);
CGContextFillEllipseInRect(ctx, NSMakeRect(0, 0, size.width, size.height));

[im unlockFocus];

[[im TIFFRepresentation] writeToFile:@"/Users/USERNAME/Desktop/foo.tiff" atomically:NO];

主要区别在于,在 OS X 上,您首先必须创建图像,然后才能开始在其中绘图;在 iOS 上,您创建上下文,然后从中提取图像。

基本上,lockFocus 使当前上下文成为图像,您可以直接在其上绘制,然后使用该图像。

我不完全确定这是否回答了您的所有问题,但我认为这至少是其中的一部分。

关于iOS 到 Mac GraphicContext 解释/转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12223739/

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