获取图片每(某)个像素点的RBGA值

最近项目有个需求,获取调色板上某个点的RBGA值,来设置背景颜色。查找了一些资料,经过多次测试,最终拿到的RGBA值基本一致(这里为什么说基本一致呢,如果RGBA值的取值范围在0~255之间的话,结果会有1-2个点的误差)。方法如下:

获取图片上某个点的RGBA值

//获取图片某个点的RGBA值
- (NSMutableArray *)getImagePixel:(UIImage *)image point:(CGPoint)aPoint {
    
    NSMutableArray *byteArray = [[NSMutableArray alloc] initWithCapacity:10];
    CGImageRef cgimage = image.CGImage;
    size_t scale = CGImageGetWidth(cgimage) / image.size.width;
    
    size_t bpr = CGImageGetBytesPerRow(cgimage);             //每行的字节数
    size_t bpp = CGImageGetBitsPerPixel(cgimage);            //每个像素的位数
    size_t bpc = CGImageGetBitsPerComponent(cgimage);        //每个字节的组成部分
    size_t bytes_per_pixel = bpp / bpc;
    
    // Get CGDataProviderRef from cgimage
    CGDataProviderRef provider = CGImageGetDataProvider(cgimage);
    
    @autoreleasepool
    {
        //Using (__bridge_transfer NSData *) casts the provider to type NSData and gives ownership to ARC, but still not discarded
        NSData *data = (__bridge_transfer NSData *)CGDataProviderCopyData(provider);
        
        const UInt8 *bytes = (Byte *)[data bytes];
        
        size_t row = aPoint.y*scale;
        size_t col = aPoint.x*scale;
        
        const UInt8* pixel = &bytes[row * bpr + col * bytes_per_pixel];
        
        for(unsigned short i = 0; i < 4; i+=4) {
            
            unsigned short red = pixel[i];                  // red channel - unused
            unsigned short green = pixel[i+1];              // green channel
            unsigned short blue = pixel[i+2];               // blue channel
            unsigned short alpha = pixel[i+3];              // alpha channel - unused
            
            [byteArray addObject:@(red)];
            [byteArray addObject:@(green)];
            [byteArray addObject:@(blue)];
            [byteArray addObject:@(alpha)];
        }
        data = nil;
    }
    return byteArray;
}

获取图片每个像素点的RGBA值

//获取图片每个像素点的RGBA值
- (NSMutableArray *)getImagePixel:(UIImage *)image point:(CGPoint)aPoint {
    
    // Create  array to add all files into total image
    NSMutableArray *byteArray = [[NSMutableArray alloc] initWithCapacity:(image.size.width * image.size.height)];
    
    CGImageRef cgimage = image.CGImage;
    
    size_t width  = CGImageGetWidth(cgimage);
    size_t height = CGImageGetHeight(cgimage);
    
    size_t bpr = CGImageGetBytesPerRow(cgimage);             //每行的字节数
    size_t bpp = CGImageGetBitsPerPixel(cgimage);            //每个像素的位数
    size_t bpc = CGImageGetBitsPerComponent(cgimage);        //每个字节的组成部分
    size_t bytes_per_pixel = bpp / bpc;
    
    // Get CGDataProviderRef from cgimage
    CGDataProviderRef provider = CGImageGetDataProvider(cgimage);
    
    @autoreleasepool
    {
        //Using (__bridge_transfer NSData *) casts the provider to type NSData and gives ownership to ARC, but still not discarded
        NSData *data = (__bridge_transfer NSData *)CGDataProviderCopyData(provider);
        
        const UInt8 *bytes = (Byte *)[data bytes];
        
        // Populate byte array with channel data from each pixel
        for(size_t row = 0; row < height; row++) {
            
            for(size_t col = 0; col < width; col++) {
                
                const UInt8* pixel = &bytes[row * bpr + col * bytes_per_pixel];
                for(unsigned short i = 0; i < 4; i+=4) {
                    
                    unsigned short red = pixel[i];                  // red channel
                    unsigned short green = pixel[i+1];              // green channel
                    unsigned short blue = pixel[i+2];               // blue channel
                    unsigned short alpha = pixel[i+3];              // alpha channel
                    
                    [byteArray addObject:@(red)];
                    [byteArray addObject:@(green)];
                    [byteArray addObject:@(blue)];
                    [byteArray addObject:@(alpha)];
                }
            }
        }
        data = nil;
    }
    return byteArray;
}


 


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值