Как применить несколько цветовых масок, используя CGImageCreateWithMaskingColors? - PullRequest
0 голосов
/ 08 февраля 2011

Я немного новичок в Objective-C и еще новее в программировании с Quartz 2D, поэтому заранее извиняюсь! У меня есть метод, в котором я хотел бы удалить несколько определенных цветов (не только один) из UIImage.

Когда я запускаю свой проект с применением только одной цветовой маски, он прекрасно работает. Как только я пытаюсь их сложить, «whiteRef» выходит NULL. Я даже пытался изменить свой метод, чтобы взять цветовую маску, а затем просто дважды запустил свой метод - подачу в разных цветовых масках - но все равно не получалось.

Любая помощь в этом с благодарностью!

- (UIImage *)doctorTheImage:(UIImage *)originalImage
{
    const float brownsMask[6] = {124, 255, 68, 222, 0, 165};
    const float whiteMask[6] = {255, 255,  255, 255, 255, 255};

    UIImageView *imageView = [[UIImageView alloc] initWithImage:originalImage];

    UIGraphicsBeginImageContext(originalImage.size);
    CGContextRef context = UIGraphicsGetCurrentContext();

    CGImageRef brownRef = CGImageCreateWithMaskingColors(imageView.image.CGImage, brownsMask);    
    CGImageRef whiteRef = CGImageCreateWithMaskingColors(brownRef, whiteMask);    
    CGContextDrawImage (context, CGRectMake(0, 0, imageView.image.size.width, imageView.image.size.height), whiteRef);

    CGImageRelease(brownRef);
    CGImageRelease(whiteRef);

    UIImage *doctoredImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    [imageView release];

    return doctoredImage;
}

1 Ответ

1 голос
/ 19 февраля 2011

Ну, я нашел хорошую работу вокруг! По сути, я в конечном итоге использовал данные изображения через MKMapView, поэтому все, что мне нужно было сделать, это разбить изображение на пиксели, и оттуда я мог возиться как угодно. Это может быть не лучшим вариантом с точки зрения скорости, но делает свое дело. Вот пример кода, который я сейчас использую.

//Split the images into pixels to mess with the image pixel colors individually
size_t bufferLength = gridWidth * gridHeight * 4;
unsigned char *rawData = nil;
rawData = (unsigned char *)[self convertUIImageToBitmapRGBA8:myUIImage];

grid = malloc(sizeof(float)*(bufferLength/4));

NSString *hexColor = nil;

for (int i = 0 ; i < (bufferLength); i=i+4)
{
hexColor = [NSString stringWithFormat: @"%02x%02x%02x", (int)(rawData[i + 0]),(int)(rawData[i + 1]),(int)(rawData[i + 2])];


//mess with colors how you see fit - I just detected certain colors and slapped 
//that into an array of floats which I later put over my mapview much like the 
//hazardmap example from apple.

if ([hexColor isEqualToString:@"ff0299"]) //pink
    value = (float)11;
if ([hexColor isEqualToString:@"9933cc"]) //purple
    value = (float)12;

//etc...

grid[i/4] = value;
}

Я также позаимствовал некоторые методы (например: convertUIImageToBitmapRGBA8) отсюда: https://gist.github.com/739132

Надеюсь, это кому-нибудь поможет!

...