【iOS效果集】自绘制酷炫粒子效果合成图片

两年前发表在简书的文章,迁移到优快云备份。原文链接:https://www.jianshu.com/p/2d6014b226d6

qq.gif

qcloud.gif

想要学习此效果需要掌握的技能有:
1.了解CALayer及自定义
2.了解CADisplayLink及其用法
3.了解CoreGraphics及相关API

核心思想就是:获取一张图片的每个像素的信息,然后生成相应个数的像素粒子,绘制在自定义的CALayer上,再使用CADisplayLink改变每个粒子的位置,并重新绘制,达到动画的效果。

一、获取图片元数据

根据CoreGraphics的相关API能获取到UIImage的元数据(rawData),rawData是个一维数组,里面存着每个像素点的RGBA数据,储存顺序为RGBARGBARGBA…分别是从第一行开始第一个像素的RGBA,第二个元素的RGBA……
根据CGImageGetWidth()|CGImageGetHeight()能得到以像素为单位的图片宽高,然后就可以用两个for循环得到所有像素点的位置和颜色信息了,然后再用自定义model保存起来。

- (NSArray*)getRGBAsFromImage:(UIImage*)image {
    //1. get the image into your data buffer.
    CGImageRef imageRef = [image CGImage];
    NSUInteger imageW = CGImageGetWidth(imageRef);
    NSUInteger imageH = CGImageGetHeight(imageRef);
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    NSUInteger bytesPerPixel = 4; //一个像素4字节
    NSUInteger bytesPerRow = bytesPerPixel * imageW;
    unsigned char *rawData = (unsigned char*)calloc(imageH*imageW*bytesPerPixel, sizeof(unsigned char)); //元数据
    NSUInteger bitsPerComponent = 8;
    CGContextRef context = CGBitmapContextCreate(rawData, imageW, imageH, bitsPerComponent, bytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast|kCGBitmapByteOrder32Big);
    CGColorSpaceRelease(colorSpace);
    CGContextDrawImage(context, CGRectMake(0, 0, imageW, imageH), imageRef);
    CGContextRelease(context);
    
    //2. Now your rawData contains the image data in the RGBA8888 pixel format.
    CGFloat addY = (_maxParticleCount == 0) ? 1 : (imageH/_maxParticleCount);
    CGFloat addX = (_
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值