NSArray может не отвечать на - PullRequest
0 голосов
/ 23 июля 2011

У меня два дня со следующей проблемой, и я не могу решить, я получил следующий код прямо здесь

+ (NSArray *)getRGB:(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 = malloc(height * width * 4);
    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;
}


-(void)getTouchColor:(UITapGestureRecognizer *) touch


{

    UIAlertView * alert =[[[UIAlertView alloc] initWithTitle:@"entrei" message:@"tap" delegate:nil cancelButtonTitle:@"cancel" otherButtonTitles:nil]autorelease];

    [alert show];

    //NSArray *Mycolors=[[[NSArray alloc] init]retain];

    CGPoint point = [touch locationInView:MyImg];

    //MyColors=[[NSArray alloc] init];


    //GetPhoto is the name of class            
    NSArray *myColors=[GetPhoto getRGB:MyImg.image AtX:point.x AndY:point.y count:3];


    //NSLog(@"cliquei");

}

Я пытаюсь заполнить NSArray с именем MyColors getRGBAsFromImage в результате,но я получаю предупреждение NSArray может не отвечать на

Я использую следующий вызов

Интересно, где я не прав!

Большое спасибо

// * извините за мой английский, пожаловаться Ларри Пейджу * //

Ответы [ 2 ]

1 голос
/ 23 июля 2011

Вы, кажется, вызываете метод на экземпляре NSArray (я предполагаю, что фактический вызывающий код выглядит по-другому?).Поскольку NSArray не распознает селектор, выдается предупреждение.Из какого класса это метод?Ради этого ответа назовем его BrunosClass.Тогда звонок должен быть:

//remove the other line you showed.
NSArray *myColors = [BrunosClass /* <--subst with real name of class */ 
    getRGBAsFromImage: myImg.image atX: point.x andY: point.y count: 3];
0 голосов
/ 23 июля 2011

Хотя я знаю, что решение должно включать исправление существующей проблемы, есть класс, который я создал, называется ANImageBitmapRep.Это обеспечивает легкий доступ к пиксельным данным изображения.Это на GitHub здесь .С помощью ANImageBitmapRep легко получить пиксели из изображения, подобного этому:

// replace myImage with your UIImage
ANImageBitmapRep * ibr = [[ANImageBitmapRep alloc] initWithImage:myImage];
BMPixel pixel = [ibr getPixelAtPoint:BMPointMake(0, 0)];
NSLog(@"Red: %f green: %f blue: %f alpha: %f", pixel.red, pixel.green, pixel.blue, pixel.alpha);
[ibr release];

Код, который у вас есть, кажется очень неэффективным для получения нескольких пикселей на изображении, поскольку он перераспределяет всеконтекст каждый раз, когда требуется пиксель.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...