2013-05-07 3 views
0

Я хочу получить цвет всех отдельных пикселей изображения. Чтобы уточнить Скажем, у меня есть изображение с именем «SampleImage», имеющее 400 x 400 пикселей. В принципе, я хочу создать сетку из «SampleImage», которая будет содержать 400 × 400 квадратов, каждый из которых будет иметь цвет, соответствующий определенному пикселю в 'SampleImage.iPhone: Как получить цвет каждого пикселя изображения?

Я знаю, что это немного абстрактно, но я новичок в iOS и не знаю с чего начать. Спасибо заранее!

+0

http://stackoverflow.com/questions/1160229/how-to-get-the-color-of-a-pixel-in-an- uiview возможно дублировать. – Buntylm

ответ

2

Этот код работал безупречно для меня -:

- (NSArray*)getRGBAsFromImage:(UIImage*)image atX:(int)xx andY:(int)yy count:(int)count{ 
    NSMutableArray *result = [NSMutableArray arrayWithCapacity:count]; 

    // First get the image into your data buffer 
    CGImageRef imageRef = [image CGImage]; 
    NSUInteger width = CGImageGetWidth(imageRef); 
    NSUInteger height = CGImageGetHeight(imageRef); 
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
    unsigned char *rawData = (unsigned char*) calloc(height * width * 4, sizeof(unsigned char)); 
    NSUInteger bytesPerPixel = 4; 
    NSUInteger bytesPerRow = bytesPerPixel * width; 
    NSUInteger bitsPerComponent = 8; 
    CGContextRef context = CGBitmapContextCreate(rawData, width, height, 
               bitsPerComponent, bytesPerRow, colorSpace, 
               kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); 
    CGColorSpaceRelease(colorSpace); 

    CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef); 
    CGContextRelease(context); 

    // Now your rawData contains the image data in the RGBA8888 pixel format. 
    int byteIndex = (bytesPerRow * yy) + xx * bytesPerPixel; 
    for (int ii = 0 ; ii < count ; ++ii) 
    { 
     CGFloat red = (rawData[byteIndex]  * 1.0)/255.0; 
     CGFloat green = (rawData[byteIndex + 1] * 1.0)/255.0; 
     CGFloat blue = (rawData[byteIndex + 2] * 1.0)/255.0; 
     CGFloat alpha = (rawData[byteIndex + 3] * 1.0)/255.0; 
     byteIndex += 4; 

     UIColor *acolor = [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; 
     [result addObject:acolor]; 
    } 

    free(rawData); 
    return result; 
} 
2

Используйте это: Вот более эффективным решение:

// UIView+ColorOfPoint.h 
@interface UIView (ColorOfPoint) 
- (UIColor *) colorOfPoint:(CGPoint)point; 
@end 

// UIView+ColorOfPoint.m 
#import "UIView+ColorOfPoint.h" 
#import <QuartzCore/QuartzCore.h> 

@implementation UIView (ColorOfPoint) 

- (UIColor *) colorOfPoint:(CGPoint)point 
{ 
    unsigned char pixel[4] = {0}; 
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
    CGContextRef context = CGBitmapContextCreate(pixel, 1, 1, 8, 4, colorSpace, kCGImageAlphaPremultipliedLast); 

    CGContextTranslateCTM(context, -point.x, -point.y); 

    [self.layer renderInContext:context]; 

    CGContextRelease(context); 
    CGColorSpaceRelease(colorSpace); 

    //NSLog(@"pixel: %d %d %d %d", pixel[0], pixel[1], pixel[2], pixel[3]); 

    UIColor *color = [UIColor colorWithRed:pixel[0]/255.0 green:pixel[1]/255.0 blue:pixel[2]/255.0 alpha:pixel[3]/255.0]; 

    return color; 
} 

@end 

Надеется, что это помогает.

+0

Спасибо Nishant и borrrden! @Nishant: Где я должен указать изображение, из которого я должен выбрать цвета? Должен ли я снова и снова вызывать этот метод для каждого пикселя или есть сокращение для него, как упоминалось в borrrden? Еще раз спасибо! –

1

Если вы новичок, вам следует сначала заняться чем-то более простым. В любом случае, вам нужно установить CGContextRef через CGBitmapContextCreate с достаточным количеством данных для хранения изображения. Создав его, вы должны сделать изображение в нем через CGDrawImage. После этого у вас будет указатель на каждый пиксель вашего изображения. Код похож на ответ Нишанта, но вместо 1x1 вы будете использовать 400x400 для получения всех пикселей одновременно.

Смежные вопросы