Сегодня я вам расскажу, как можно перевести цветное изображение в черно-белое.
Метод convertToGrayscale:
Параметры:
— source: Исходное цветное изображение UIImage
Возвращаемое значение:
— Результирующее изображение UIImage
typedef enum { ALPHA = 0, BLUE = 1, GREEN = 2, RED = 3 } PIXELS; - (UIImage *)convertToGrayscale:(UIImage *)source { CGSize size = [source size]; int width = size.width; int height = size.height; // пиксели будут размещены в этом массиве uint32_t *pixels = (uint32_t *) malloc(width * height * sizeof(uint32_t)); // чистим пиксели с сохранением прозрачности memset(pixels, 0, width * height * sizeof(uint32_t)); // создаем цветовое пространство CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); // создаем контекст в схеме RGBA CGContextRef context = CGBitmapContextCreate(pixels, width, height, 8, width * sizeof(uint32_t), colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedLast); // рисуем изображение, которое будет по размеру массива пикселей CGContextDrawImage(context, CGRectMake(0, 0, width, height), source.CGImage); // используем вложенный цикл, чтобы пройтись по всем пикселям изображения for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { uint8_t *rgbaPixel = (uint8_t *) &pixels[y * width + x]; // конвертируем в черно-белый, используя рекомендуемый метод из Вики: http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale uint32_t gray = 0.3 * rgbaPixel[RED] + 0.59 * rgbaPixel[GREEN] + 0.11 * rgbaPixel[BLUE]; // устанавливаем пиксель в серых тонах rgbaPixel[RED] = gray; rgbaPixel[GREEN] = gray; rgbaPixel[BLUE] = gray; } } // создаем CGImageRef, содержащий новый контекст пикселей CGImageRef image = CGBitmapContextCreateImage(context); // освобождаем память CGContextRelease(context); CGColorSpaceRelease(colorSpace); free(pixels); // делаем результирующий UIImage для возврата UIImage *resultUIImage = [UIImage imageWithCGImage:image]; // освобождаем память CGImageRelease(image); // возвращаем полученное черно-белое изображение return resultUIImage; }
Немає коментарів:
Дописати коментар