iOS 图片取色器

iOS图片取色计,直接上代码
#import "ViewController.h"
@interface ViewController ()
@property(nonatomic,strong)UIImageView *imageView;
@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.view.backgroundColor=[UIColor whiteColor];
    
    UIImageView *imageView=[[UIImageView alloc]init];
    
    if (fabs(([[UIScreen mainScreen] bounds].size.height - 568)) < 1)
    {
        // 5 & 5s & 5c
        imageView.image=[UIImage imageNamed:@"RGBCircle_5"];
        imageView.frame=CGRectMake(54, 44, imageView.image.size.width, imageView.image.size.height);
        
    }
    else if (fabs(([[UIScreen mainScreen] bounds].size.height - 667)) < 1)
    {
        // 6 & 6s
        imageView.image=[UIImage imageNamed:@"RGBCircle_6"];
        imageView.frame=CGRectMake(57, 44, imageView.image.size.width, imageView.image.size.height);
    }
    else if (fabs(([[UIScreen mainScreen] bounds].size.height - 736)) < 1)
    {
        // 6p & 6sp
        imageView.image=[UIImage imageNamed:@"RGBCircle_6p"];
        imageView.frame=CGRectMake(62, 44, imageView.image.size.width, imageView.image.size.height);
        
    }
    
    NSLog(@"ooooo %f %f",imageView.image.size.width,imageView.image.size.height);
    imageView.userInteractionEnabled=YES;
    self.imageView=imageView;
    [self.view addSubview:imageView];
    
}

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    //触点对象
    UITouch *touch=touches.anyObject;
    //触点位置
    CGPoint touchLocation=[touch locationInView:self.imageView];
    //触点颜色
    UIColor *positionColor=[self getPixelColorAtLocation:touchLocation];
    
    const CGFloat *components=CGColorGetComponents(positionColor.CGColor);
    
    NSString *rValue=[NSString stringWithFormat:@"%d",(int)(components[0]*255)];
    NSString *gValue=[NSString stringWithFormat:@"%d",(int)(components[1]*255)];
    NSString *bValue=[NSString stringWithFormat:@"%d",(int)(components[2]*255)];
    NSLog(@"我看看结果:%@ %@ %@",rValue,gValue,bValue);
}



- (UIColor*) getPixelColorAtLocation:(CGPoint)point
{
    UIColor* color = nil;
    UIImageView *colorImageView=self.imageView;
    CGImageRef inImage = colorImageView.image.CGImage;
    // Create off screen bitmap context to draw the image into. Format ARGB is 4 bytes for each pixel: Alpa, Red, Green, Blue
    CGContextRef cgctx = [self createARGBBitmapContextFromImage:inImage];
    if (cgctx == NULL)
    {
        return nil;
    }
    size_t w = CGImageGetWidth(inImage);
    size_t h = CGImageGetHeight(inImage);
    CGRect rect = {{0,0},{w,h}};
    
    // Draw the image to the bitmap context. Once we draw, the memory
    // allocated for the context for rendering will then contain the
    // raw image data in the specified color space.
    CGContextDrawImage(cgctx, rect, inImage);
    
    // Now we can get a pointer to the image data associated with the bitmap
    // context.
    unsigned char* data = CGBitmapContextGetData (cgctx);
    if (data != NULL)
    {
        //offset locates the pixel in the data from x,y.
        //4 for 4 bytes of data per pixel, w is width of one row of data.
        @try
        {
            int offset = 4*((w*round(point.y))+round(point.x));
            //NSLog(@"offset: %d", offset);
            int alpha =  data[offset];
            int red = data[offset+1];
            int green = data[offset+2];
            int blue = data[offset+3];
//            NSLog(@"offset: %i colors: RGB A %i %i %i  %i",offset,red,green,blue,alpha);
            color = [UIColor colorWithRed:(red/255.0f) green:(green/255.0f) blue:(blue/255.0f) alpha:(alpha/255.0f)];
        }
        @catch (NSException * e)
        {
            NSLog(@"%@",[e reason]);
        }
        @finally
        {
            
        }
        
    }
    
    // When finished, release the context
    CGContextRelease(cgctx);
    // Free image data memory for the context
    if (data)
    {
        free(data);
    }
    
    return color;
}



- (CGContextRef) createARGBBitmapContextFromImage:(CGImageRef) inImage
{
    
    CGContextRef    context = NULL;
    CGColorSpaceRef colorSpace;
    void *          bitmapData;
    int             bitmapByteCount;
    int             bitmapBytesPerRow;
    
    // Get image width, height. We'll use the entire image.
    size_t pixelsWide = CGImageGetWidth(inImage);
    size_t pixelsHigh = CGImageGetHeight(inImage);
    
    // Declare the number of bytes per row. Each pixel in the bitmap in this
    // example is represented by 4 bytes; 8 bits each of red, green, blue, and
    // alpha.
    bitmapBytesPerRow   = (int)(pixelsWide * 4);
    bitmapByteCount     =(int)(bitmapBytesPerRow * pixelsHigh);
    
    // Use the generic RGB color space.
    colorSpace = CGColorSpaceCreateDeviceRGB();
    
    if (colorSpace == NULL)
    {
        fprintf(stderr, "Error allocating color space\n");
        return NULL;
    }
    
    // Allocate memory for image data. This is the destination in memory
    // where any drawing to the bitmap context will be rendered.
    bitmapData = malloc( bitmapByteCount );
    if (bitmapData == NULL)
    {
        fprintf (stderr, "Memory not allocated!");
        CGColorSpaceRelease( colorSpace );
        return NULL;
    }
    
    // Create the bitmap context. We want pre-multiplied ARGB, 8-bits
    // per component. Regardless of what the source image format is
    // (CMYK, Grayscale, and so on) it will be converted over to the format
    // specified here by CGBitmapContextCreate.
    context = CGBitmapContextCreate (bitmapData,
                                     pixelsWide,
                                     pixelsHigh,
                                     8,      // bits per component
                                     bitmapBytesPerRow,
                                     colorSpace,
                                     kCGImageAlphaPremultipliedFirst);
    if (context == NULL)
    {
        free (bitmapData);
        fprintf (stderr, "Context not created!");
    }
    
    // Make sure and release colorspace before returning
    CGColorSpaceRelease( colorSpace );
    
    return context;
}@end
取色的区域要做判断的,非图片区域取色不准。取色会有误差,但人眼感觉不出来,可以使用rgb在线生成器生成颜色。

你可能感兴趣的:(iOS 图片取色器)