我有两张相同格式和尺寸的图片。
我想循环每个图像的像素,找到最左上角和右上角的差异坐标。
差异被认为是具有相同坐标的两个像素的像素颜色。
你能给我一个循环通过Image像素并获取其颜色值的示例代码吗?
答案 0 :(得分: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
希望这有帮助。
答案 1 :(得分:0)
我认为你被投票了,因为你用google搜索并不清楚,不知道,也许你做了,而你的google-fu今天也没有用。我知道我有过这样的日子!
无论如何,How to get the RGB values for a pixel on an image on the iphone应该可以帮到你。