iOS: 遍历图像像素

3

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

我想循环遍历每张图片的像素,并找到最左上角和最右下角的不同坐标。

不同是指具有相同坐标的两个像素的颜色不同。

您能否提供一个示例代码,循环遍历图像像素并获取其颜色值?

2个回答

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

希望这能帮助到您。

0

我认为你被踩是因为不清楚你是否使用了谷歌搜索,也许你用谷歌的能力今天不太好。我知道我有过那样的日子!

无论如何,如何在iPhone上获取图像像素的RGB值应该能帮到你。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接