iOS 制作一个取色板

先看效果

iOS 制作一个取色板_第1张图片
Text.gif

效果讲解:imageView上有张素材图片,手指移到该图片的某个坐标,获取该坐标点上对应像素的rgba值,动态改变self.view.backGroundColor

实现这个效果有几点要求:
1.有一张素材图片,当然也可以通过代码绘制一个渐变效果的Image(CAGradientLayer)。这里用素材
2.图片的size要和imageView的size相同,否则坐标不准确,获取到的rgb也不准
3.获取图片上某点的rgb值

第一个要求就不说了。
第二个,大部分情况下image的size都不等于imageView,专门制作的除外。所以需要动态处理image的size。

//自定义img的尺寸
- (UIImage *)customImageWith:(UIImage *)image toSize:(CGSize)toSize
{
    UIGraphicsBeginImageContext(CGSizeMake(toSize.width, toSize.height));
    [image drawInRect:CGRectMake(0, 0, toSize.width, toSize.height)];
    UIImage *customImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    return customImage;
}

那么现在拿到了对应size的image,开始获取指定坐标上的rgb。(获取手指触摸到的坐标点就不用我说了吧)

//获取图片上某坐标点对应的像素的rgba值
- (UIColor *)getPointColorWithImage:(UIImage *)image location:(CGPoint)point
{
    UIColor *pointColor = nil;
    
    //如果图片上不存在该点返回nil
    if (!CGRectContainsPoint(CGRectMake(0.0f, 0.0f, image.size.width, image.size.height), point)) {
        return nil;
    }
    
    NSInteger pointX = truncl(point.x); //直接舍去小数,如1.58 -> 1.0
    NSInteger pointY= truncl(point.y);
    CGImageRef cgImage = image.CGImage;
    NSUInteger width = image.size.width;
    NSUInteger height = image.size.height;
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();  //bitmap上下文使用的颜色空间
    int bytesPerPixel = 4;  //bitmap在内存中所占的比特数
    int bytesPerRow = bytesPerPixel * 1;   //bitmap的每一行在内存所占的比特数
    NSUInteger bitsPerComponent = 8;   //内存中像素的每个组件的位数.例如,对于32位像素格式和RGB 颜色空间,你应该将这个值设为8.
    unsigned char pixelData[4] = {0, 0, 0, 0};  //初始化像素信息
    
    //创建位图文件环境。位图文件可自行百度 bitmap
    CGContextRef context = CGBitmapContextCreate(pixelData,
                                                 1,
                                                 1,
                                                 bitsPerComponent,
                                                 bytesPerRow,
                                                 colorSpace,
                                                 kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); //指定bitmap是否包含alpha通道,像素中alpha通道的相对位置,像素组件是整形还是浮点型等信息的字符串。
    CGColorSpaceRelease(colorSpace);
    
    CGContextSetBlendMode(context, kCGBlendModeCopy); //当一个颜色覆盖上另外一个颜色,两个颜色的混合方式
    
    CGContextTranslateCTM(context, -pointX, pointY - (CGFloat)height);  //改变画布位置
    CGContextDrawImage(context, CGRectMake(0.0f, 0.0f, (CGFloat)width, (CGFloat)height ), cgImage);   //绘制图片
    CGContextRelease(context);
    
    CGFloat red = (CGFloat)pixelData[0] / 255.0f;
    CGFloat green = (CGFloat)pixelData[1] / 255.0f;
    CGFloat blue = (CGFloat)pixelData[2] / 255.0f;
    CGFloat alpha = (CGFloat)pixelData[3] / 255.0f;
    
    pointColor = [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
    
    return pointColor;
}

大功告成,拿到pointColor。

你可能感兴趣的:(iOS 制作一个取色板)