2012-04-11 54 views
3

我有两张相同格式和大小的图像。iOS:循环播放图像的像素

我想遍历每个图像的像素,找到最左上角和右上角的差异坐标。

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

您能否给我提供一个示例代码,循环访问Image像素并获取其颜色值?

回答

4

这对我的作品(这是使用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 

希望这有助于。