Фильтрация изображений

#ios #cocoa-touch #image-processing #filter #uiimage

#iOS #прикосновение какао #обработка изображений #Фильтр #uiimage

Вопрос:

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

Вот несколько фильтров, с которыми я сталкиваюсь, чтобы достичь

  1. Ностальгия
  2. Винтаж
  3. Старый

Исходное изображение

введите описание изображения здесь

Ностальгия

введите описание изображения здесь

Винтаж

введите описание изображения здесь

Старый

введите описание изображения здесь

Если кто-нибудь может направить меня в правильном направлении, это было бы здорово.

Заранее благодарю.

Ответ №1:

Эта тема очень информативна о фильтрации изображений в iphone…

Редактировать

Это то, что я сделал, чтобы сделать изображение винтажным (требования к винтажному изображению в моем случае были немного другими..У него не было оттенков по краям)

 //first increase contrast a bit...
float contrastValue             =   1.45;
CGImageRef originalImage        =   [myImage CGImage];
CGColorSpaceRef colorSpace      =   CGColorSpaceCreateDeviceRGB();
CGContextRef bitmapContext      =   CGBitmapContextCreate(NULL,CGImageGetWidth(originalImage),CGImageGetHeight(originalImage),8,CGImageGetWidth(originalImage)*4,colorSpace,kCGImageAlphaPremultipliedLast);
CGColorSpaceRelease(colorSpace);
CGContextDrawImage(bitmapContext, CGRectMake(0, 0, CGBitmapContextGetWidth(bitmapContext), CGBitmapContextGetHeight(bitmapContext)), originalImage);
UInt8* data                     =   CGBitmapContextGetData(bitmapContext);
int numComponents               =   4;
int bytesInContext              =   CGBitmapContextGetHeight(bitmapContext) * CGBitmapContextGetBytesPerRow(bitmapContext);
double redIn, greenIn, blueIn;

for (int i = 0; i < bytesInContext; i  = numComponents) {
    redIn                       =   (double)data[i]/255.0;
    greenIn                     =   (double)data[i 1]/255.0;
    blueIn                      =   (double)data[i 2]/255.0;
    
    redIn                       -=  0.5;
    redIn                       *=  contrastValue;
    redIn                        =  0.5;
    redIn                       *=  255.0;
    if (redIn < 0) {
        redIn                   =   0;
    }
    if (redIn > 255) {
        redIn                   =   255;
    }
    
    greenIn                     -=  0.5;
    greenIn                     *=  contrastValue;
    greenIn                      =  0.5;
    greenIn                     *=  255.0;
    if (greenIn < 0) {
        greenIn                 =   0;
    }
    if (greenIn > 255) {
        greenIn                 =   255;
    }
    
    
    blueIn                      -=  0.5;
    blueIn                      *=  contrastValue;
    blueIn                       =  0.5;
    blueIn                      *=  255.0;
    if (blueIn < 0) {
        blueIn                  =   0;
    }
    if (blueIn > 255) {
        blueIn                  =   255;
    }
    data[i]                     =   (redIn);
    data[i 1]                   =   (greenIn);
    data[i 2]                   =   (blueIn);
}
CGImageRef outImage             =   CGBitmapContextCreateImage(bitmapContext);
myImage                         =   [UIImage imageWithCGImage:outImage];
CGImageRelease(outImage);

//Then blend it with a yellowish color
UIGraphicsBeginImageContext(myImage.size);
CGContextRef ctx                =   UIGraphicsGetCurrentContext();
CGRect area                     =   CGRectMake(0, 0, myImage.size.width, myImage.size.height);
CGContextScaleCTM(ctx, 1, -1);
CGContextTranslateCTM(ctx, 0, -area.size.height);
CGContextSaveGState(ctx);
CGContextClipToMask(ctx, area, myImage.CGImage);
UIColor *color                  =   [UIColor colorWithRed:248.0/255.0 green:254.0/255.0 blue:186.0/255.0 alpha:1.0]; //[UIColor colorWithRed:248.0/255.0 green:254.0/255.0 blue:186.0/255.0 alpha:1.0]
[color set];
CGContextFillRect(ctx, area);
CGContextRestoreGState(ctx);
CGContextSetBlendMode(ctx, kCGBlendModeMultiply);
CGContextDrawImage(ctx, area, myImage.CGImage);
myImage                         =   UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

UIGraphicsBeginImageContext(myImage.size);
ctx                             =   UIGraphicsGetCurrentContext();
 area                           =   CGRectMake(0, 0, myImage.size.width, myImage.size.height);
CGContextScaleCTM(ctx, 1, -1);
CGContextTranslateCTM(ctx, 0, -area.size.height);
CGContextSaveGState(ctx);
CGContextClipToMask(ctx, area, myImage.CGImage);
color                           =   [UIColor colorWithRed:27.0/255.0 green:50.0/255.0 blue:224.0/255.0 alpha:0.2]; //[UIColor colorWithRed:248.0/255.0 green:254.0/255.0 blue:186.0/255.0 alpha:1.0]
[color set];
CGContextFillRect(ctx, area);
CGContextRestoreGState(ctx);
CGContextSetBlendMode(ctx, kCGBlendModeLighten);
CGContextDrawImage(ctx, area, myImage.CGImage);
processedImage                  =   UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
 

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

Комментарии:

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

2. Проблема в том, что имя фильтра изображений типа «старый» не является стандартным, как «шкала серого» .. поэтому очень сложно получить информацию о его базовой логике…

3. Увидев свою винтажную фотографию, если у вас есть время, просто попробуйте это .. 1. немного увеличьте контрастность изображения.. 2. Нарисуйте радиальный градиент над изображением со светлым в центре и темным по окружности.. (Чтобы получить темные края винтажного изображения) .. 3. Затем смешайте его с желтоватым цветом… Просто поиграйте с этим… Именно это я и сделал, когда у меня возникло подобное требование..

4. @Кришнабхадра: Hi…am также необходимы фильтры изображений, использующие основную графику. Если у вас есть какой-либо исходный код, касающийся фильтров, можете ли вы отправить их мне?

Ответ №2:

сначала ознакомьтесь с документацией по основному образу. Core image поставляется с iOS 5.0 и представляет собой мощный API для обработки изображений.

Также вы можете использовать Quartz для рисования изображения и поверх слоя с различными вариантами наложения (cgcontextset BlendMode) для достижения некоторых приятных эффектов.

Если этих методов недостаточно, вы можете попробовать изменять значения цвета попиксельно. Попробуйте этот URL, может быть, вы найдете что-то для себя.

Комментарии:

1. Спасибо за ответ. Мое приложение не поддерживает iOS 5.0. Вот почему я столкнулся с проблемой.

Ответ №3:

Похоже, вам нужно определить параметры преобразования RGB. Если у вас уже есть инструмент для создания эффектов «винтаж», «старый» и «ностальгия», то вы можете обработать образец изображения, содержащий все 256 ^ 3 цвета RGB (как этот), а затем наблюдать, например, цветовой канал за цветовым каналом, чтобы начать просто, как пиксель значения изменяются. Этого может быть достаточно, чтобы вывести функцию преобразования RGB. А «старый» потребует темной тени на границе.