Изменить картинку фоновое изображение - PullRequest
2 голосов
/ 05 марта 2012

То, чего я пытаюсь добиться, - это сделать снимок с помощью камеры iPhone, а затем заменить часть снимка на другие снимки ... Я думал о том, чтобы сделать снимок и затем наложить его на UIView с низким коэффициентом альфа, но затемЯ не смог бы заменить только определенные части картины.Если бы вы могли дать мне несколько идей, я был бы очень благодарен.

Ответы [ 2 ]

1 голос
/ 05 марта 2012

Для iOS есть несколько API для изображений, и я понимаю ваше замешательство.Сначала у вас есть UIImage, абстракция CocoaTouch для изображений.Тогда у вас есть CGImage, абстракция CoreGraphics для изображений.И, кроме того, у вас есть CIImage, абстракция CoreImage для изображений.

Это все разные сущности, которые нельзя использовать вместе без использования мостов.Вместо этого вам нужно конвертировать в и из разных форматов.

Как правило, в итоге вам нужно получить UIImage, который вы можете отобразить в виджете.Вы можете создать это изображение из CGImage или CIImage.CIImage содержит расширенные функциональные возможности фильтра, которые, например, позволят вам поместить другое изображение сверху, как вы описываете, используя соответствующий композиционный фильтр.

CIImage быстрее и лучше в любом случае, однако это все ещене полностью поддерживается в iOS.Возможно, вы еще не создали свои собственные пользовательские фильтры для iOS, и только часть фильтров еще не поддерживается.

Поэтому я бы порекомендовал использовать для этой цели CGImage.Вам необходимо выполнить рендеринг в новый контекст рендеринга, а затем создать UIImage из этого контекста рендеринга.

Это должно сработать:

UIImage *originalImage = ...;
UIImage *frontImage = ...;
CGSize destinationSize = originalImage.frame.size;

UIGraphicsBeginImageContext(destinationSize);
[originalImage drawInRect:CGRectMake(0,0,destinationSize.width,destinationSize.height)];
[originalImage drawInRect:CGRectMake(10,10,destinationSize.width - 20,destinationSize.height - 20)];
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
0 голосов
/ 01 ноября 2013

объясняю вам в баллах 1. использовать библиотеку кварцкор 2. преобразовать оба изображения в ciimage. код для преобразования: (есть много, я выбираю один из многих)

 CIImage *paper1 =[CIImage imageWithData:UIImageJPEGRepresentation( [UIImage imageNamed:@"heart123.png"], 1)];

Теперь используйте фильтры в соответствии с вашими потребностями, например .. фильтры CISourceAtopCompositing или CISourceOverCompositing и вы получаете то, что вы хотите

код для их использования:

CIContext *context = [CIContext contextWithOptions:nil];

   CIFilter filter= [CIFilter filterWithName:@"CISourceAtopCompositing"];  //for CISourceAtopCompositing method
    [filter setDefaults];
    [filter setValue:sourceImage forKey:@"inputImage"]; 
    [filter setValue:backgroundImage forKey:@"inputBackgroundImage"];

Здесь и backgroundImage, и sourceImage - это CIImage, преобразованные из UIImage

Теперь, чтобы получить uiimage после редактирования, используйте этот код

 CIImage *outputImage = [filter valueForKey:@"outputImage"];
 CGImageRef cgImage = [context createCGImage:outputImage fromRect:[outputImage extent]];
 UIImage *outputUIImage = [UIImage imageWithCGImage:cgImage];
...