比较 IOS 中两个图像的 RGB
Compare RGB of two images in IOS
在我的应用程序中,我需要比较两个图像的 RGB 是否相同。
我正在使用此代码...
-(CGFloat)compareImage:(UIImage *)imgPre capturedImage:(UIImage *)imgCaptured
{
int colorDiff;
CFDataRef pixelData = CGDataProviderCopyData(CGImageGetDataProvider(imgPre.CGImage));
int myWidth = (int )CGImageGetWidth(imgPre.CGImage)/2;
int myHeight =(int )CGImageGetHeight(imgPre.CGImage)/2;
const UInt8 *pixels = CFDataGetBytePtr(pixelData);
int bytesPerPixel_ = 4;
int pixelStartIndex = (myWidth + myHeight) * bytesPerPixel_;
UInt8 alphaVal = pixels[pixelStartIndex];
UInt8 redVal = pixels[pixelStartIndex + 1];
UInt8 greenVal = pixels[pixelStartIndex + 2];
UInt8 blueVal = pixels[pixelStartIndex + 3];
UIColor *color = [UIColor colorWithRed:(redVal/255.0f) green:(greenVal/255.0f) blue:(blueVal/255.0f) alpha:(alphaVal/255.0f)];
NSLog(@"color of image=%@",color);
NSLog(@"color of R=%hhu/G=%hhu/B=%hhu",redVal,greenVal,blueVal);
CFDataRef pixelDataCaptured = CGDataProviderCopyData(CGImageGetDataProvider(imgCaptured.CGImage));
int myWidthCaptured = (int )CGImageGetWidth(imgCaptured.CGImage)/2;
int myHeightCaptured =(int )CGImageGetHeight(imgCaptured.CGImage)/2;
const UInt8 *pixelsCaptured = CFDataGetBytePtr(pixelDataCaptured);
int pixelStartIndexCaptured = (myWidthCaptured + myHeightCaptured) * bytesPerPixel_;
UInt8 alphaValCaptured = pixelsCaptured[pixelStartIndexCaptured];
UInt8 redValCaptured = pixelsCaptured[pixelStartIndexCaptured + 1];
UInt8 greenValCaptured = pixelsCaptured[pixelStartIndexCaptured + 2];
UInt8 blueValCaptured = pixelsCaptured[pixelStartIndexCaptured + 3];
UIColor *colorCaptured = [UIColor colorWithRed:(redValCaptured/255.0f) green:(greenValCaptured/255.0f) blue:(blueValCaptured/255.0f) alpha:(alphaValCaptured/255.0f)];
NSLog(@"color of captured image=%@",colorCaptured);
NSLog(@"color of captured image R=%hhu/G=%hhu/B=%hhu",redValCaptured,greenValCaptured,blueValCaptured);
colorDiff=sqrt((redVal-249)*(redVal-249)+(greenVal-greenValCaptured)*(greenVal-greenValCaptured)+(blueVal-blueValCaptured)*(blueVal-blueValCaptured));
return colorDiff;
}
但是当我按名称设置图像时,此方法 returns 具有相同的 RGB 值。
@interface ViewController ()<UIImagePickerControllerDelegate, UINavigationControllerDelegate>
{
IBOutlet UIImageView *imgLeft;
IBOutlet UIImageView *imgRight;
IBOutlet UILabel *lblLeft;
IBOutlet UILabel *lblRight;
IBOutlet UILabel *lblResult;
CGFloat redLeft,GreenLeft,BlueLeft;
CGFloat redRight,GreenRight,BlueRight;
}
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
UITapGestureRecognizer * tapRecognizerLeft = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(imageTappedLeft:)];
[imgLeft addGestureRecognizer:tapRecognizerLeft];
imgLeft.userInteractionEnabled = YES;
UITapGestureRecognizer * tapRecognizerRight = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(imageTappedRight:)];
[imgRight addGestureRecognizer:tapRecognizerRight];
imgRight.userInteractionEnabled = YES;
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
-(IBAction)calculateDistance:(id)sender
{
CGFloat derivedRedDiff=redLeft-redRight;
if (derivedRedDiff<0) {
derivedRedDiff*=-1;
}
CGFloat derivedGreenDiff=GreenLeft-GreenRight;
if (derivedGreenDiff<0) {
derivedGreenDiff*=-1;
}
CGFloat derivedBlueDiff=BlueLeft-BlueRight;
if (derivedBlueDiff<0) {
derivedBlueDiff*=-1;
}
CGFloat distance=sqrtf(derivedRedDiff*derivedRedDiff+derivedGreenDiff*derivedGreenDiff+derivedBlueDiff*derivedBlueDiff);
NSLog(@"Distance = %f",distance);
lblResult.text=[NSString stringWithFormat:@"Distance = %f",distance];
}
-(void)imageTappedLeft:(UITapGestureRecognizer *)recognizer
{
CGPoint point = [recognizer locationInView:imgLeft];
UIGraphicsBeginImageContext(imgLeft.bounds.size);
CGContextRef context = UIGraphicsGetCurrentContext();
[imgLeft.layer renderInContext:context];
int bpr =(int) CGBitmapContextGetBytesPerRow(context);
unsigned char * data = CGBitmapContextGetData(context);
if (data != NULL)
{
int offset = bpr*round(point.y) + 4*round(point.x);
int blue = data[offset+0];
int green = data[offset+1];
int red = data[offset+2];
int alpha = data[offset+3];
CGFloat derivedAlpha=alpha/255.0f;
NSLog(@"%d %d %d %d %f", alpha, red, green, blue,derivedAlpha);
redLeft=red;
GreenLeft=green;
BlueLeft=blue;
lblLeft.text=[NSString stringWithFormat:@"%d %d %d %f", red, green, blue,derivedAlpha];
}
UIGraphicsEndImageContext();
}
-(void)imageTappedRight:(UITapGestureRecognizer *)recognizer
{
CGPoint point = [recognizer locationInView:imgRight];
UIGraphicsBeginImageContext(imgRight.bounds.size);
CGContextRef context = UIGraphicsGetCurrentContext();
[imgRight.layer renderInContext:context];
int bpr =(int) CGBitmapContextGetBytesPerRow(context);
unsigned char * data = CGBitmapContextGetData(context);
if (data != NULL)
{
int offset = bpr*round(point.y) + 4*round(point.x);
int blue = data[offset+0];
int green = data[offset+1];
int red = data[offset+2];
int alpha = data[offset+3];
CGFloat derivedAlpha=alpha/255.0f;
NSLog(@"%d %d %d %d %f", alpha, red, green, blue,derivedAlpha);
redRight=red;
GreenRight=green;
BlueRight=blue;
lblRight.text=[NSString stringWithFormat:@"%d %d %d %f", red, green, blue,derivedAlpha];
}
UIGraphicsEndImageContext();
}
在我的应用程序中,我需要比较两个图像的 RGB 是否相同。 我正在使用此代码...
-(CGFloat)compareImage:(UIImage *)imgPre capturedImage:(UIImage *)imgCaptured
{
int colorDiff;
CFDataRef pixelData = CGDataProviderCopyData(CGImageGetDataProvider(imgPre.CGImage));
int myWidth = (int )CGImageGetWidth(imgPre.CGImage)/2;
int myHeight =(int )CGImageGetHeight(imgPre.CGImage)/2;
const UInt8 *pixels = CFDataGetBytePtr(pixelData);
int bytesPerPixel_ = 4;
int pixelStartIndex = (myWidth + myHeight) * bytesPerPixel_;
UInt8 alphaVal = pixels[pixelStartIndex];
UInt8 redVal = pixels[pixelStartIndex + 1];
UInt8 greenVal = pixels[pixelStartIndex + 2];
UInt8 blueVal = pixels[pixelStartIndex + 3];
UIColor *color = [UIColor colorWithRed:(redVal/255.0f) green:(greenVal/255.0f) blue:(blueVal/255.0f) alpha:(alphaVal/255.0f)];
NSLog(@"color of image=%@",color);
NSLog(@"color of R=%hhu/G=%hhu/B=%hhu",redVal,greenVal,blueVal);
CFDataRef pixelDataCaptured = CGDataProviderCopyData(CGImageGetDataProvider(imgCaptured.CGImage));
int myWidthCaptured = (int )CGImageGetWidth(imgCaptured.CGImage)/2;
int myHeightCaptured =(int )CGImageGetHeight(imgCaptured.CGImage)/2;
const UInt8 *pixelsCaptured = CFDataGetBytePtr(pixelDataCaptured);
int pixelStartIndexCaptured = (myWidthCaptured + myHeightCaptured) * bytesPerPixel_;
UInt8 alphaValCaptured = pixelsCaptured[pixelStartIndexCaptured];
UInt8 redValCaptured = pixelsCaptured[pixelStartIndexCaptured + 1];
UInt8 greenValCaptured = pixelsCaptured[pixelStartIndexCaptured + 2];
UInt8 blueValCaptured = pixelsCaptured[pixelStartIndexCaptured + 3];
UIColor *colorCaptured = [UIColor colorWithRed:(redValCaptured/255.0f) green:(greenValCaptured/255.0f) blue:(blueValCaptured/255.0f) alpha:(alphaValCaptured/255.0f)];
NSLog(@"color of captured image=%@",colorCaptured);
NSLog(@"color of captured image R=%hhu/G=%hhu/B=%hhu",redValCaptured,greenValCaptured,blueValCaptured);
colorDiff=sqrt((redVal-249)*(redVal-249)+(greenVal-greenValCaptured)*(greenVal-greenValCaptured)+(blueVal-blueValCaptured)*(blueVal-blueValCaptured));
return colorDiff;
}
但是当我按名称设置图像时,此方法 returns 具有相同的 RGB 值。
@interface ViewController ()<UIImagePickerControllerDelegate, UINavigationControllerDelegate>
{
IBOutlet UIImageView *imgLeft;
IBOutlet UIImageView *imgRight;
IBOutlet UILabel *lblLeft;
IBOutlet UILabel *lblRight;
IBOutlet UILabel *lblResult;
CGFloat redLeft,GreenLeft,BlueLeft;
CGFloat redRight,GreenRight,BlueRight;
}
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
UITapGestureRecognizer * tapRecognizerLeft = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(imageTappedLeft:)];
[imgLeft addGestureRecognizer:tapRecognizerLeft];
imgLeft.userInteractionEnabled = YES;
UITapGestureRecognizer * tapRecognizerRight = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(imageTappedRight:)];
[imgRight addGestureRecognizer:tapRecognizerRight];
imgRight.userInteractionEnabled = YES;
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
-(IBAction)calculateDistance:(id)sender
{
CGFloat derivedRedDiff=redLeft-redRight;
if (derivedRedDiff<0) {
derivedRedDiff*=-1;
}
CGFloat derivedGreenDiff=GreenLeft-GreenRight;
if (derivedGreenDiff<0) {
derivedGreenDiff*=-1;
}
CGFloat derivedBlueDiff=BlueLeft-BlueRight;
if (derivedBlueDiff<0) {
derivedBlueDiff*=-1;
}
CGFloat distance=sqrtf(derivedRedDiff*derivedRedDiff+derivedGreenDiff*derivedGreenDiff+derivedBlueDiff*derivedBlueDiff);
NSLog(@"Distance = %f",distance);
lblResult.text=[NSString stringWithFormat:@"Distance = %f",distance];
}
-(void)imageTappedLeft:(UITapGestureRecognizer *)recognizer
{
CGPoint point = [recognizer locationInView:imgLeft];
UIGraphicsBeginImageContext(imgLeft.bounds.size);
CGContextRef context = UIGraphicsGetCurrentContext();
[imgLeft.layer renderInContext:context];
int bpr =(int) CGBitmapContextGetBytesPerRow(context);
unsigned char * data = CGBitmapContextGetData(context);
if (data != NULL)
{
int offset = bpr*round(point.y) + 4*round(point.x);
int blue = data[offset+0];
int green = data[offset+1];
int red = data[offset+2];
int alpha = data[offset+3];
CGFloat derivedAlpha=alpha/255.0f;
NSLog(@"%d %d %d %d %f", alpha, red, green, blue,derivedAlpha);
redLeft=red;
GreenLeft=green;
BlueLeft=blue;
lblLeft.text=[NSString stringWithFormat:@"%d %d %d %f", red, green, blue,derivedAlpha];
}
UIGraphicsEndImageContext();
}
-(void)imageTappedRight:(UITapGestureRecognizer *)recognizer
{
CGPoint point = [recognizer locationInView:imgRight];
UIGraphicsBeginImageContext(imgRight.bounds.size);
CGContextRef context = UIGraphicsGetCurrentContext();
[imgRight.layer renderInContext:context];
int bpr =(int) CGBitmapContextGetBytesPerRow(context);
unsigned char * data = CGBitmapContextGetData(context);
if (data != NULL)
{
int offset = bpr*round(point.y) + 4*round(point.x);
int blue = data[offset+0];
int green = data[offset+1];
int red = data[offset+2];
int alpha = data[offset+3];
CGFloat derivedAlpha=alpha/255.0f;
NSLog(@"%d %d %d %d %f", alpha, red, green, blue,derivedAlpha);
redRight=red;
GreenRight=green;
BlueRight=blue;
lblRight.text=[NSString stringWithFormat:@"%d %d %d %f", red, green, blue,derivedAlpha];
}
UIGraphicsEndImageContext();
}