美文网首页初见
iOS 获取图像指定点的颜色 (已修复bug)

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

作者: hahand | 来源:发表于2019-03-05 16:44 被阅读2次

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

  1. 之前bug:读取的颜色比图片实际低了一个像素点
    修复思路:将 pointY手动+1处理
NSInteger pointY = trunc(point.y + 1); //原错误:NSInteger pointY = trunc(point.y); 
  1. 之前bug:2x3x图片读取错误
    修复思路:将widthheight提前乘以比例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

相关文章

网友评论

    本文标题:iOS 获取图像指定点的颜色 (已修复bug)

    本文链接:https://www.haomeiwen.com/subject/kxzjwftx.html