iOS到Mac GraphicContext说明/转换

前端之家收集整理的这篇文章主要介绍了iOS到Mac GraphicContext说明/转换前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我已经在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使当前上下文成为图像,并直接绘制到其上,然后使用该图像.

我不完全确定这是否回答了你所有的问题,但我认为这至少是它的一部分.

原文链接:https://www.f2er.com/iOS/336715.html

猜你在找的iOS相关文章