周六加班的人伤不起a,既然公司要求周六要上班,那么为了不让时间荒废,只好逼着自己学习东西了,发现这样也挺好的,要不然在家玩一玩时间也就过去了。
由于前期项目中用到了图片的倒影效果,牵扯到2方面的知识,1,让图片转动,2,实现渐变效果。效果不是我做的,动画也好久没看了,今天就看看代码,正好复习一下。
用到的几个关键的类型,这是学Quartz 2D的基础,了解的同学可以过了,这里简单做个解释
CGContextRef : An opaque type that represents a Quartz 2D drawing environment.
意思是:代表Quartz 2D绘画环境的集成数据类型。在quartz 2D 编程,牵扯到绘画的,都需要用到context上下文。
CGImageRef: An opaque type that encapsulates bitmap image information.
意思就是说:一种封装了图像信息的集成类型.
CGGradientRef:控制渐变色的集成数据类型。
了解了三个指针,那么就可以实现我们需要的效果了。
首先,要实现图片的渐变效果,我们必须生成一个渐变效果的图片。直接贴代码了。
CGImageRef gradientMaskImage = NULL;
//api规定图片的渐变色的color space 必须是deviceGray , 不可以是CGColorSpaceCreateDeviceRGB
// 渐变色由黑到白,首先拿到颜色句柄。
CGColorSpaceRef colorSpace =CGColorSpaceCreateDeviceGray();
//通过颜色,生成位图上下文环境句柄
CGContextRef gradientBitmapContext = CGBitmapContextCreate(NULL, 1, reflectionHeight, 8, 0, colorSpace, kCGImageAlphaNone);
// 定义渐变色开始和结束的颜色值,用alpha值表示,但是context不支持alpha值,但是渐变色需要这种色值
CGFloat colors[] = {0.0, 1.0, 1, 1.0};
// 生成渐变色句柄
CGGradientRef grayScaleGradient = CGGradientCreateWithColorComponents(colorSpace, colors, NULL, 2);
CGColorSpaceRelease(colorSpace);
// 设置渐变开始和结束的点位置
CGPoint gradientStartPoint = CGPointZero;
CGPoint gradientEndPoint = CGPointMake(0, endPoint);
// 把渐变色句柄信息设置到context里面,这样我们的上下文句柄里面就包含了渐变色的功能
CGContextDrawLinearGradient(gradientBitmapContext,
grayScaleGradient,
gradientStartPoint,
gradientEndPoint,
kCGGradientDrawsAfterEndLocation);
CGGradientRelease(grayScaleGradient);
// 把拥有渐变色的句柄转换成图片句柄,这样我们简单的图片句柄就生成了,已经含由渐变色功能了。
gradientMaskImage = CGBitmapContextCreateImage(gradientBitmapContext);
CGContextRelease(gradientBitmapContext);
//现在需要再生成一个上下文句柄,颜色空间是CGColorSpaceCreateDeviceRGB
CGColorSpaceRef colorSpace2 = CGColorSpaceCreateDeviceRGB();
//create the bitmap context
CGContextRef bitmapContext = CGBitmapContextCreate(NULL, 300, 200,8,0,
colorSpace2,
(kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst));
//清除没用的指针必不可少
CGColorSpaceRelease(colorSpace2);
CGContextClipToMask(bitmapContext, CGRectMake(0.0, 0.0, 300, 200), gradientMaskImage);
CGImageRelease(gradientMaskImage);
//图片的旋转
CGContextTranslateCTM(bitmapContext,0.0, 200);
CGContextScaleCTM(bitmapContext, 1.0, -1.0);
//通过设置好的上下文资源句柄和 self.CGImage原图片,生成一张新的图片
CGContextDrawImage(bitmapContext, CGRectMake(0, 0, 300, 200), self.CGImage);
CGImageRelease(gradientMaskImage);
CGImageRef reflectionImage = CGBitmapContextCreateImage(bitmapContext);
CGContextRelease(bitmapContext);
//转换图片句柄成为一张旋转的,渐变的新图
UIImage * theImage = [UIImage imageWithCGImage:reflectionImage];
CGImageRelease(reflectionImage);
这样一幅图片就完成了