iOS 获取图像指定点的颜色 (已修复bug)

百度上iOS获取图像指定点的颜色 的搜索了一份源代码,实际用起来发现有bug。于是乎自己稍微修改了一下。

  1. 之前bug:读取的颜色比图片实际低了一个像素点
    修复思路:将 pointY手动+1处理
NSInteger pointY = trunc(point.y + 1); //原错误:NSInteger pointY = trunc(point.y); 
  1. 之前bug:2x和3x图片读取错误
    修复思路:将width和height提前乘以比例scale以获取真实像素值
NSUInteger width = self.size.width * self.scale; //原错误:NSUInteger width = self.size.width;
NSUInteger height = self.size.height * self.scale; //原错误:NSUInteger height = self.size. height;
  1. 之前bug:带alpha通道的 png图片的颜色会变黑
    修复思路:返回的颜色数值应该是被乘以alpha之后的值,所以再除回去
CGFloat red   = (CGFloat)pixelData[0] / 255.0f / alpha; //原错误:CGFloat red   = (CGFloat)pixelData[0] / 255.0f;
CGFloat green = (CGFloat)pixelData[1] / 255.0f / alpha; //原错误:CGFloat green = (CGFloat)pixelData[1] / 255.0f;
CGFloat blue  = (CGFloat)pixelData[2] / 255.0f / alpha; //原错误:CGFloat blue  = (CGFloat)pixelData[2] / 255.0f;

终于完工,看一下测试效果

#import "UIImage+ColorAtPixel.h"

@implementation UIImage (ColorAtPixel)

//获取图片某一点的颜色
- (UIColor *)colorAtPixel:(CGPoint)point {
    NSUInteger width = self.size.width * self.scale;
    NSUInteger height = self.size.height * self.scale;

    if ( !CGRectContainsPoint( CGRectMake(0.0f, 0.0f, width, height ), point ) ) {
        return nil;
    }
    
    NSInteger pointX = trunc(point.x);
    NSInteger pointY = trunc(point.y + 1);
    CGImageRef cgImage = self.CGImage;
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    int bytesPerPixel = 4;
    int bytesPerRow = bytesPerPixel * 1;
    NSUInteger bitsPerComponent = 8;
    unsigned char pixelData[4] = { 0, 0, 0, 0 };
    CGContextRef context = CGBitmapContextCreate(pixelData,
                                                 1,
                                                 1,
                                                 bitsPerComponent,
                                                 bytesPerRow,
                                                 colorSpace,
                                                 kCGImageAlphaPremultipliedLast |     kCGBitmapByteOrder32Big);
    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 alpha = (CGFloat)pixelData[3] / 255.0f;
    if (alpha == 0) {
        return [UIColor clearColor];
    }
    CGFloat red   = (CGFloat)pixelData[0] / 255.0f / alpha;
    CGFloat green = (CGFloat)pixelData[1] / 255.0f / alpha;
    CGFloat blue  = (CGFloat)pixelData[2] / 255.0f / alpha;
    
    UIColor *resultColor =  [UIColor colorWithRed: red green: green blue: blue alpha: alpha];
    
    return resultColor;
}

@end

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容