iOS 获取图像指定点的颜色 (已修复bug)
2019-03-05 本文已影响2人
hahand
百度上iOS获取图像指定点的颜色
的搜索了一份源代码,实际用起来发现有bug。于是乎自己稍微修改了一下。
- 之前bug:读取的颜色比图片实际低了一个像素点
修复思路:将pointY
手动+1
处理
NSInteger pointY = trunc(point.y + 1); //原错误:NSInteger pointY = trunc(point.y);
- 之前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;
- 之前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