#ios #cocoa-touch #image-processing #filter #uiimage
#iOS #прикосновение какао #обработка изображений #Фильтр #uiimage
Вопрос:
У меня есть приложение, которое требует некоторой работы над фильтрами изображений, поэтому я только начал работать над фильтрами, и у меня получилось несколько фильтров, таких как черно-белый, Hud, moss, яркость, контрастность и т.д.
Вот несколько фильтров, с которыми я сталкиваюсь, чтобы достичь
- Ностальгия
- Винтаж
- Старый
Исходное изображение
Ностальгия
Винтаж
Старый
Если кто-нибудь может направить меня в правильном направлении, это было бы здорово.
Заранее благодарю.
Ответ №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. А «старый» потребует темной тени на границе.