Как уменьшить набор цветов в Objective-C - PullRequest
1 голос
/ 11 октября 2019

Я очень, очень плохо знаком с Objective-C (это для приложения React Native), и я пытаюсь сократить список цветов и удалить дубликаты.

У меня есть этона данный момент:

... code related to pulling pixels from an image

float flexibility = 2;
float range = 60;

NSMutableArray * colors = [NSMutableArray new];

float x = 0;
float y = 0;
for (int n = 0; n<(width*height); n++){

  int index = (bytesPerRow * y) + x * bytesPerPixel;
  int red   = rawData[index];
  int green = rawData[index + 1];
  int blue  = rawData[index + 2];
  int alpha = rawData[index + 3];
  NSArray * a = [NSArray arrayWithObjects:[NSString stringWithFormat:@"%i",red],[NSString stringWithFormat:@"%i",green],[NSString stringWithFormat:@"%i",blue],[NSString stringWithFormat:@"%i",alpha], nil];
  [colors addObject:a];

  y++;
  if (y==height){
    y=0;
    x++;
  }
}
free(rawData);

Теперь скрипт, на котором я основываюсь, имеет некоторый код для сокращения списка:

NSMutableDictionary * colourCounter = [NSMutableDictionary new];

//count the occurences in the array
NSCountedSet *countedSet = [[NSCountedSet alloc] initWithArray:colors];
for (NSString *item in countedSet) {
    NSUInteger count = [countedSet countForObject:item];
    [colourCounter setValue:[NSNumber numberWithInteger:count] forKey:item];
}

//sort keys highest occurrence to lowest
NSArray *orderedKeys = [colourCounter keysSortedByValueUsingComparator:^NSComparisonResult(id obj1, id obj2){
    return [obj2 compare:obj1];
}];

//checks if the colour is similar to another one already included
NSMutableArray * ranges = [NSMutableArray new];
for (NSString * key in orderedKeys){
    NSArray * rgb = [key componentsSeparatedByString:@","];
    int r = [rgb[0] intValue];
    int g = [rgb[1] intValue];
    int b = [rgb[2] intValue];
    bool exclude = false;
    for (NSString * ranged_key in ranges){
        NSArray * ranged_rgb = [ranged_key componentsSeparatedByString:@","];

        int ranged_r = [ranged_rgb[0] intValue];
        int ranged_g = [ranged_rgb[1] intValue];
        int ranged_b = [ranged_rgb[2] intValue];

        if (r>= ranged_r-range && r<= ranged_r+range){
            if (g>= ranged_g-range && g<= ranged_g+range){
                if (b>= ranged_b-range && b<= ranged_b+range){
                    exclude = true;
                }
            }
        }
    }

    if (!exclude){ [ranges addObject:key]; }
}

//return ranges array here if you just want the ordered colours high to low
NSMutableArray * colourArray = [NSMutableArray new];
for (NSString * key in ranges){
    NSArray * rgb = [key componentsSeparatedByString:@","];
    float r = [rgb[0] floatValue];
    float g = [rgb[1] floatValue];
    float b = [rgb[2] floatValue];
    UIColor * colour = [UIColor colorWithRed:(r/255.0f) green:(g/255.0f) blue:(b/255.0f) alpha:1.0f];
    [colourArray addObject:colour];
}

//if you just want an array of images of most common to least, return here
//return [NSDictionary dictionaryWithObject:colourArray forKey:@"colours"];

В конечном итоге я хочу вернуть этот colourArray (исходная библиотекаиспользует цвет, я использую цвет, так что вы иногда будете видеть то или иное написание - я, вероятно, стандартизирую его для цвета, когда закончу).

Однако всякий раз, когда я использую этот код, RN генерирует ошибку:

Unrecognized selector

Насколько я могу судить, это связано с вызовом функции, которая не существует? Я что-то здесь упускаю или неправильно звоню?

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