Чтение и редактирование пикселей изображения на iPhone - PullRequest
0 голосов
/ 05 декабря 2010

Любопытно, как читать и редактировать пиксели картинки на iPhone. Мне лучше использовать массив точек с цветами?

Я хочу сделать что-то вроде ... если CGPoint пересекается с "коричневым" пятном на картинке, установите цвет всех коричневых пикселей в радиусе на белый. Будут еще вопросы, но это только начало.

Приветствия

1 Ответ

1 голос
/ 05 декабря 2010

Данные изображения доступны вам именно так - двумерный массив пикселей, каждый пиксель представлен 32-битным целым числом.Для каждого из компонентов цвета (красный, зеленый, синий и альпга) существует 8-битное значение.Порядок этих значений шириной 8 бит в пределах 32-битного целого числа зависит от формата данных изображения.Документ Apple обо всем этом действительно хорош.Хотя есть некоторые привлекательные вещи Apple, использующие CGDataProviderCopyData, чтобы дать вам указатель на фактическое хранилище данных UIImage, на практике это может быть головной болью, поскольку формат этого внутреннего хранилища может сильно различаться от одного изображения к другому.На практике большинство людей, занимающихся обработкой изображений, используют этот подход:

    CGImageRef image = [UIImage CGImage];
    NSUInteger width = CGImageGetWidth(image);
    NSUInteger height = CGImageGetHeight(image);
    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));
    CGContextRelease(context);

    //  rawData contains image data in the RGBA8888 format.

    // for any pixel at coordinate x,y -- the value is
    // 

    int pixelIndex = (bytesPerRow * y) + x * bytesPerPixel;
    unsigned char red = rawData[pixelIndex];
    green = rawData[pixelIndex + 1];
    blue = rawData[pixelIndex + 2];
    alpha = rawData[pixelIndex + 3];
...