Как определить «цвет определенного пикселя» на изображении? - PullRequest
0 голосов
/ 03 июля 2010

У меня есть изображение, которое находится внутри просмотра изображений.Я хочу найти цвет определенного пикселя (скажем, х = 10, у = 20) внутри изображения.Рабочий код действительно помог бы мне.

Ответы [ 2 ]

1 голос
/ 03 июля 2010

Это очень сильно зависит от типа изображения:)

Если у вас есть байтовые данные, и вы знаете, как они расположены, например, PNG использует RGBA , значит, вы подняли ногу.

Либеральное использование всех функций CGImage , таких как CGImageGetBitsPerComponent и CGImageGetColorSpace, будет вашим руководством.

Чтобы получить действительные байтовые данные, CGImageDestinationCreateWithData Создает место назначения изображения, которое записывает в объект изменяемых данных базового основания (NSMutableData * / CFMutableDataRef)

Если все это бессмысленно, начните с Руководство по программированию Quart2D .

0 голосов
/ 03 июля 2010

Вот очень простой сценарий класса для работы с изображением в виде растрового изображения.Когда вы создаете этот объект с

ImageBitmap * imageBitmap = [[ImageBitmap alloc] initWithImage:myImageView.image  bitmapInfo:kCGImageAlphaNoneSkipLast];

Вы можете получить доступ к любому пикселю в (x, y) как

Byte * pixel = [imageBitmap pixelAtX:x Y:y];

RGB-компонентам на 0, 1, 2 байта, поэтому

Byte red = pixel[0]; etc.

вы можете как читать, так и записывать пиксели, например, установите удалить зеленый компонент из пикселя:

pixel[1] = 0;

, если использовать kCGImageAlphaPremultipliedLast pixel [3] имеет альфа

//ImageBitmap.h
@interface ImageBitmap : NSObject {
  int height, width;
  void * contextData;
  CGContextRef context;
  CGBitmapInfo bitmapInfo;
}

@property(assign)       int height;
@property(assign)       int width;
@property(readonly)     CGContextRef    context;
@property(readonly)     void * contextData;

-(id)initWithSize:(CGSize)size bitmapInfo:(CGBitmapInfo)bmInfo;
-(id)initWithImage:(UIImage *)image  bitmapInfo:(CGBitmapInfo)bmInfo;
-(CGContextRef)createBitmapContextWithData:(void *)data;
- (UIImage *)imageFromContext;
-(Byte *)pixelAtX:(NSInteger)pixelX Y:(NSInteger)pixelY;

//ImageBitmap.m
#import "ImageBitmap.h"


@implementation ImageBitmap

@synthesize width, height;
@synthesize context, contextData;
-(id)initWithSize:(CGSize)size bitmapInfo:(CGBitmapInfo)bmInfo{
     if (self = [super init]) {
        height = size.height;
        width = size.width;
        contextData = malloc(width * height * 4);
        bitmapInfo = bmInfo;
        context = [self createBitmapContextWithData:contextData];
    }
    return self;
}

-(id)initWithImage:(UIImage *)image  bitmapInfo:(CGBitmapInfo)bmInfo{
    [self initWithSize:image.size bitmapInfo:bmInfo];
    CGContextDrawImage(context, CGRectMake(0, 0, width, height),image.CGImage);
    return self;
} 

-(CGContextRef)  createBitmapContextWithData:(void *)data{
    CGContextRef    ctx = NULL;
    int bitmapBytesPerRow   = (width * 4); 
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    if (data == NULL){
        return NULL;
    }
    ctx = CGBitmapContextCreate (data,
                                    width,
                                    height,
                                    8,      // bits per component
                                    bitmapBytesPerRow,
                                    colorSpace,
                                    bitmapInfo); //kCGImageAlphaNoneSkipLast or kCGImageAlphaPremultipliedLast

    CGColorSpaceRelease( colorSpace );
    return ctx;
}

- (UIImage *)imageFromContext{
    CGImageRef cgImage = CGBitmapContextCreateImage(context);
    return [UIImage imageWithCGImage:cgImage];
}

-(Byte *)pixelAtX:(NSInteger)pixelX Y:(NSInteger)pixelY{
    return (Byte *)contextData + (width * pixelY + pixelX)*4;
}

@end
...