我已经在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)),[[UIScreen mainScreen]scale]); [image drawInRect:CGRectMake(0,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,size.width,size.height)); CGContextSetFillColorWithColor(ctx,[[NSColor blueColor] CGColor]); CGContextFillEllipseInRect(ctx,size.height)); [im unlockFocus]; [[im TIFFRepresentation] writeToFile:@"/Users/USERNAME/Desktop/foo.tiff" atomically:NO];
主要区别在于,在OS X上,您首先必须创建图像,然后可以开始绘制;在iOS上创建上下文,然后从中提取图像.
基本上,lockFocus使当前上下文成为图像,并直接绘制到其上,然后使用该图像.
我不完全确定这是否回答了你所有的问题,但我认为这至少是它的一部分.