Iphone iOS:在图像的像素上循环

Iphone iOS:在图像的像素上循环,iphone,ios,image-processing,uiimage,Iphone,Ios,Image Processing,Uiimage,我有两张格式和大小相同的图片 我想循环每个图像的像素,找到最左上角和右下角的差异坐标 差异被认为是具有相同坐标的两个像素的像素颜色 你能给我提供一个通过图像像素循环并获得其颜色值的示例代码吗 我认为你被否决了,因为根本不清楚你是否用谷歌搜索过,不知道,也许是你用谷歌搜索过,而你的谷歌搜索引擎今天不起作用。我知道我曾经有过这样的日子 无论如何,可能会对您有所帮助。这对我很有用(这是使用ARC): 希望这有帮助 - (BOOL) pointInside: (CGPoint) point withEv

我有两张格式和大小相同的图片

我想循环每个图像的像素,找到最左上角和右下角的差异坐标

差异被认为是具有相同坐标的两个像素的像素颜色


你能给我提供一个通过图像像素循环并获得其颜色值的示例代码吗

我认为你被否决了,因为根本不清楚你是否用谷歌搜索过,不知道,也许是你用谷歌搜索过,而你的谷歌搜索引擎今天不起作用。我知道我曾经有过这样的日子

无论如何,可能会对您有所帮助。

这对我很有用(这是使用ARC):

希望这有帮助

- (BOOL) pointInside: (CGPoint) point withEvent: (UIEvent *) event {
    CGRect r = CGRectZero ;

    r.size =[self size] ;

    CGFloat red ;
    CGFloat green ;
    CGFloat blue ;
    CGFloat alpha ;

    if (point.x < 0 || point.x > r.size.width || point.y < 0 || point.y > r.size.height) {
        return NO ;
    }

    [inspector colorAt:point red:&red green:&green blue:&blue alpha:&alpha] ;

    return alpha > 0.01f ;
}
// CGImageInspection.h
#import <Foundation/Foundation.h>

@interface CGImageInspection : NSObject

+ (CGImageInspection *) imageInspectionWithCGImage: (CGImageRef) imageRef ;

- (void) colorAt: (CGPoint) location
             red: (CGFloat *) red 
           green: (CGFloat *) green
            blue: (CGFloat *) blue
           alpha: (CGFloat *) alpha ;

@end
// CGImageInspection.mm
@interface CGImageInspection ()

- (id) initWithCGImage: (CGImageRef) imageRef ;

@property (assign, nonatomic) CGContextRef  context ;
@property (assign, nonatomic) void *        pixels ;
@property (assign, nonatomic) NSUInteger    bytesPerRow ;
@property (assign, nonatomic) NSUInteger    bytesPerPixel ;

@end

@implementation CGImageInspection

@synthesize context ;
@synthesize pixels ;
@synthesize bytesPerRow ;
@synthesize bytesPerPixel ;

- (void) dealloc {
    if (self.context) {
        ::CGContextRelease(self.context) ;
        self.context = 0 ;
    }

    if (self.pixels) {
        ::free(self.pixels) ;
        self.pixels = 0 ;
    }

    ::NSLog(@"CGImageInspection going away") ;
}

+ (CGImageInspection *) imageInspectionWithCGImage: (CGImageRef) imageRef {
    return [[CGImageInspection alloc] initWithCGImage:imageRef] ;
}

- (id) initWithCGImage: (CGImageRef) imageRef {

    if (self = [super init]) {
        size_t  pixelsWide = ::CGImageGetWidth(imageRef) ;
        size_t  pixelsHigh = ::CGImageGetHeight(imageRef) ;

        self.bytesPerPixel = 4 ;
        self.bytesPerRow = (pixelsWide * self.bytesPerPixel) ;
        int     bitmapByteCount   = (self.bytesPerRow * pixelsHigh) ;

        CGColorSpaceRef colorSpace= ::CGColorSpaceCreateDeviceRGB() ;

        if (colorSpace == 0) {
            return nil ;
        }

        self.pixels = ::calloc(bitmapByteCount, 1) ;
        if (self.pixels == 0) {
            ::CGColorSpaceRelease(colorSpace) ;
            return nil ;
        }

        self.context = ::CGBitmapContextCreate(
            self.pixels
        ,   pixelsWide
        ,   pixelsHigh
        ,   8      // bits per component
        ,   self.bytesPerRow
        ,   colorSpace
        ,   kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big) ;

        if (self.context == 0) {
            ::free(self.pixels) ;
            self.pixels = 0 ;
            ::CGColorSpaceRelease(colorSpace) ;
            return nil ;
        }
        ::CGContextDrawImage(context, (CGRect) {{0, 0}, {pixelsWide, pixelsHigh}}, imageRef) ;
        ::CGColorSpaceRelease(colorSpace) ;
    }

    return self ;

}

- (void) colorAt: (CGPoint) location
             red: (CGFloat *) red 
           green: (CGFloat *) green
            blue: (CGFloat *) blue
           alpha: (CGFloat *) alpha {

    int yy = (int) location.y ;
    int xx = (int) location.x ;

    int byteIndex = (bytesPerRow * yy) + xx * bytesPerPixel ;
    unsigned char * raw = (unsigned char *) self.pixels ;
    raw += byteIndex ;

    *red    = ((CGFloat) (*raw++)) / 255.0f ;
    *green  = ((CGFloat) (*raw++)) / 255.0f ;
    *blue   = ((CGFloat) (*raw++)) / 255.0f ;
    *alpha  = ((CGFloat) (*raw++)) / 255.0f ;
}

@end