mac osx 涂抹马赛克实现

实现原理

参考 iOS手指涂抹位置变马赛克的实现 实现 mac osx 版本

图片马赛克实现

借助CoreImage 库中的 CIFilter 滤镜,我们可以轻易实现图片的马赛克 代码如下


NSImage * img1 = [NSImage imageNamed:@"1.png"];
CGImageSourceRef source = CGImageSourceCreateWithData((__bridge  CFDataRef)img1.TIFFRepresentation, nil);
CGImageRef inImage = CGImageSourceCreateImageAtIndex(source, 0, nil);
CIImage *ciImage  = [[CIImage alloc] initWithCGImage:inImage];
CIFilter *filter  = [CIFilter filterWithName:@"CIPixellate"];
[filter setDefaults];
[filter setValue:ciImage forKey:kCIInputImageKey];
[filter setValue:@(10.f) forKey:kCIInputScaleKey];
CIImage * outPutImg = [filter outputImage];
NSCIImageRep * rep = [NSCIImageRep imageRepWithCIImage:outPutImg];
NSImage *img2 = [[NSImage alloc] initWithSize:[outPutImg extent].size];
[img2 addRepresentation:rep];

CAShapeLayer

通过图层遮罩来实现 根据Path 显示马赛克

//mac 使用layer 必须设置wantsLayer = YES,默认是NO
self.view.wantsLayer = YES;
//添加layer(imageLayer)到self上
self.imageLabyer = [CALayer layer];
self.imageLabyer.frame = self.view.bounds;
[self.view.layer addSublayer:self.imageLabyer];

self.shapeLayer = [CAShapeLayer layer];
self.shapeLayer.frame = self.view.bounds;
self.shapeLayer.lineCap = kCALineCapRound;
self.shapeLayer.lineJoin = kCALineJoinRound;
self.shapeLayer.lineWidth = 40.0f;
self.shapeLayer.strokeColor = [[NSColor blueColor] CGColor];
self.shapeLayer.fillColor = nil;
[self.view.layer addSublayer:self.shapeLayer];

//设置mask
self.imageLabyer.mask = self.shapeLayer;
self.path = CGPathCreateMutable();
//设置马赛克图片
self.imageLabyer.contents = img2;
//设置底图
self.view.layer.contents = img1;

鼠标响应处理

设置View 监听鼠标移动消息
[self.view addTrackingRect:self.view.bounds owner:self userData:nil assumeInside:YES];

处理鼠标移动消息


- (void)mouseDown:(NSEvent *)event
{
    CGPoint pt = event.locationInWindow;
    CGPathMoveToPoint(self.path, NULL, pt.x, pt.y);
    CGMutablePathRef path = CGPathCreateMutableCopy(self.path);
    self.shapeLayer.path = path;
    CGPathRelease(path);
    NSLog(@"mouseDown");
}

-(void)mouseUp:(NSEvent *)event
{
    NSLog(@"mouseUp");
}
-(void)mouseDragged:(NSEvent *)event
{
    CGPoint pt = event.locationInWindow;
    CGPathAddLineToPoint(self.path, NULL,pt.x, pt.y);
    CGMutablePathRef path = CGPathCreateMutableCopy(self.path);
    self.shapeLayer.path = path;
    CGPathRelease(path);
    NSLog(@"mouseDragged");
}

效果图

效果图

源码

深圳利程电子有限公司


所有图片均来自网络


   转载规则


《mac osx 涂抹马赛克实现》 smoking 采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
 上一篇
《坚持,一种可以养成的习惯》读后感 《坚持,一种可以养成的习惯》读后感
什么是习惯 所谓习惯就是“不依赖意志或毅力,把自己想要持续的事情引导到如每天刷牙般轻松的状态”。总之,保持行动自动地持续进行,就是“习惯”。​习惯就是在脑中设定的程序。从早上起床的时间到通勤路线、用餐时间等,大脑每天光是花时间计划这所有
2019-05-19
下一篇 
mac osx 剪贴板操作 mac osx 剪贴板操作
macosx 实现剪贴板的打开、查询、赋值、清空的等基本操作
2019-05-17
  目录