给图片添加马赛克效果

  放大马赛克图片可以看到,可以看到一个个单色的小正方形。所以马赛克其实也就是把某一点的色值填充了它一定范围内的一个正方形,这样看起来就会模糊,但整体还是有一定原来的样子。如图,一张图片可以认为是9*9个色值组成的位图,进行马赛克转换就变成:

         转换为           

可知,就是把某一位的色值向右向下填充一个2*2的正方形。

 1 + (UIImage *)transToMosaicImage:(UIImage*)orginImage blockLevel:(NSUInteger)level
 2 {
 3     //获取BitmapData
 4     CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
 5     CGImageRef imgRef = orginImage.CGImage;
 6     CGFloat width = CGImageGetWidth(imgRef);
 7     CGFloat height = CGImageGetHeight(imgRef);
 8     CGContextRef context = CGBitmapContextCreate (nil,
 9                                                   width,
10                                                   height,
11                                                   kBitsPerComponent,        //每个颜色值8bit
12                                                   width*kPixelChannelCount, //每一行的像素点占用的字节数,每个像素点的ARGB四个通道各占8个bit
13                                                   colorSpace,
14                                                   kCGImageAlphaPremultipliedLast);
15     CGContextDrawImage(context, CGRectMake(0, 0, width, height), imgRef);
16     unsigned char *bitmapData = CGBitmapContextGetData (context);
17
18     //这里把BitmapData进行马赛克转换,就是用一个点的颜色填充一个level*level的正方形
19     unsigned char pixel[kPixelChannelCount] = {0};
20     NSUInteger index,preIndex;
21     for (NSUInteger i = 0; i < height - 1 ; i++) {
22         for (NSUInteger j = 0; j < width - 1; j++) {
23             index = i * width + j;
24             if (i % level == 0) {
25                 if (j % level == 0) {
26                     memcpy(pixel, bitmapData + kPixelChannelCount*index, kPixelChannelCount);
27                 }else{
28                     memcpy(bitmapData + kPixelChannelCount*index, pixel, kPixelChannelCount);
29                 }
30             } else {
31                 preIndex = (i-1)*width +j;
32                 memcpy(bitmapData + kPixelChannelCount*index, bitmapData + kPixelChannelCount*preIndex, kPixelChannelCount);
33             }
34         }
35     }
36
37     NSInteger dataLength = width*height* kPixelChannelCount;
38     CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, bitmapData, dataLength, NULL);
39     //创建要输出的图像
40     CGImageRef mosaicImageRef = CGImageCreate(width, height,
41                                               kBitsPerComponent,
42                                               kBitsPerPixel,
43                                               width*kPixelChannelCount ,
44                                               colorSpace,
45                                               kCGImageAlphaPremultipliedLast,
46                                               provider,
47                                               NULL, NO,
48                                               kCGRenderingIntentDefault);
49     CGContextRef outputContext = CGBitmapContextCreate(nil,
50                                                        width,
51                                                        height,
52                                                        kBitsPerComponent,
53                                                        width*kPixelChannelCount,
54                                                        colorSpace,
55                                                        kCGImageAlphaPremultipliedLast);
56     CGContextDrawImage(outputContext, CGRectMake(0.0f, 0.0f, width, height), mosaicImageRef);
57     CGImageRef resultImageRef = CGBitmapContextCreateImage(outputContext);
58     UIImage *resultImage = nil;
59     if([UIImage respondsToSelector:@selector(imageWithCGImage:scale:orientation:)]) {
60         float scale = [[UIScreen mainScreen] scale];
61         resultImage = [UIImage imageWithCGImage:resultImageRef scale:scale orientation:UIImageOrientationUp];
62     } else {
63         resultImage = [UIImage imageWithCGImage:resultImageRef];
64     }
65     //释放
66     if(resultImageRef){
67         CFRelease(resultImageRef);
68     }
69     if(mosaicImageRef){
70         CFRelease(mosaicImageRef);
71     }
72     if(colorSpace){
73         CGColorSpaceRelease(colorSpace);
74     }
75     if(provider){
76         CGDataProviderRelease(provider);
77     }
78     if(context){
79         CGContextRelease(context);
80     }
81     if(outputContext){
82         CGContextRelease(outputContext);
83     }
84
85     return resultImage;
86 }

demo详见我的github<> 点击下载源码

时间: 2024-11-03 01:32:35

给图片添加马赛克效果的相关文章

[Xcode10 实际操作]六、媒体与动画-(5)使用CoreImage框架给图片添加马赛克效果

本文将演示如何使用CoreImage图像处理框架,给图片添加像素化的滤镜效果. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] 1 import UIKit 2 //首先导入要使用的框架,该框架提供了强大和高效的图像处理功能, 3 //用来对基于像素的图像进行分析.操作和特效处理 4 import CoreImage 5 6 class ViewController: UIViewController { 7 8 override func viewDidLo

街机扫描线之为图片添加扫描效果

为图片添加一些额外效果,会使图片更耐看一些,下面来看看如何为一张普通图片添加扫描效果. 首先是下载软件,可到软件主页下载:街机扫描线_v10(正式版) 看一下制作先后的对比图: 原图效果: 制作后加入了扫描效果的效果图: 用街机扫描线制作这种效果图只需简单的几步操作即可完成,貌似用PS做这种效果图也可以做出来,但是会很复杂.下面说一下制作方法. 1.用任意看图软件或浏览器打开一张需要制作扫描效果的图片,也可直接在网页上制作. 2.下载 街机扫描线 之后解压到任意目录,运行 街机扫描线_v10(正

iOS 图片实现马赛克效果

/** *实现马赛克效果 */ // 导出CIImage图片 CIImage *ciImage = [[CIImage alloc] initWithImage:[UIImageimageNamed:@"De.png"]]; // 1.创建Filter滤镜 CIFilter *filter = [CIFilter filterWithName:@"CIPixellate"]; [filter setValue:ciImage forKey:kCIInputImage

android项目 之 记事本(12) ----- 图片的等比例缩放及给图片添加边框

本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020 在Android的UI开发中经常会遇到图片的缩放,就比如记事本,现在的图片都比较大,如果将原图不经缩放直接放在屏幕上,则会占满整个屏幕,而且有时图片会比屏幕还大,这时就不能完全的显示整个图片,所以,必须要进行缩放,但在缩放时,该如何缩放呢,长和宽的缩放比例设置为多少合适呢,为了保持原图的纵横比,所以要最好的方法就是约束缩放比例,也就是等比例缩放,相信大家都用过PS中的缩放图片的

如何使用CSS给图片添加双边框效果

如何使用CSS给图片添加双边框效果:建议:尽可能的手写代码,可以有效的提高学习效率和深度.给图片添加双边框也在实际使用中也有许多应用,可能并不频繁,在这里简单介绍一下如何实现此种效果,借以对CSS一些属性的应用加以熟练.先看一段代码实例: <!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <meta name="author" content="

为图片添加半透明遮罩效果

平时为图片添加半透明遮罩效果,我的做法如下:利用标签i实现背景半透明遮罩 <p class="opacity-black-position"><a href="#"><img src="images/4601.jpg" alt=""><i></i></a></p> 为html结构添加如下css样式: /* 利用标签i实现背景半透明遮罩, 兼容性

万彩动画大师丨如何给图片添加上升气泡的动画效果

给图片文字添加上升气泡的动画效果,可以给观众带来一种梦幻般的视觉感受. 在[时间轴区域]中点击[+],会弹出一个小窗体,接着在窗体的[搜索框]中输入动画效果[气泡]的首字母[qp]并搜索,接着会看到有[气泡]的动画效果,选择并点击[上升气泡]的动画效果,然后点击[确定],就可以实现给图片添加气泡上升的强调动画效果,如下图所示: 原文地址:https://www.cnblogs.com/focusky/p/10213282.html

万彩动画大师给图片添加倒影、阴影、模糊等装修效果

给图片添加倒影.阴影或者模糊等装修效果,可以提高动画视频的艺术感和专业感. 1. 给图片添加倒影的装修效果 单击选中图片,在右边属性栏中找到[样式],点击[样式]里面的滚动条,滑到[倒影]的样式,选择其中一个倒影效果的样式即可,如下图所示: 2. 给图片添加阴影的装修效果 鼠标单击选中图片,在画布的右边属性栏中找到并点击[装修效果],弹出[装修效果]小窗体,然后点击[效果],设置阴影前记得先钩选中[应用阴影],然后就可以设置阴影了,最后点击[确定],如下图所示: 3. 给图片添加模糊的装修效果

CSS3图片轮播效果

原文:CSS3图片轮播效果 在网页中用到图片轮播效果,单纯的隐藏.显示,那再简单不过了,要有动画效果,如果是自己写的话(不用jquery等),可能要费点时间.css3的出现,让动画变得不再是问题,而且简单易用.下面介绍我用css3与js写的一个图片轮播效果. 一般图片轮播就是三四张图片: <div class="wrap"> <div class="carousel"> <div><img src="http://