Como faço para criar uma nova imagem, desenhando em cima de um já existente usando Quartz?
-
08-07-2019 - |
Pergunta
Eu tenho uma visão com uiimageview i atribuir esta imagem uiimageview por camera..now eu quero fazer algum desenho para imagem .... usando falta coregraphics.i fazer algo assim ... selecionar uma área tocando e desenho de linha quando a linha se junta algo como círculo ou qualquer shape..i quer mudar nessa área em particular para algo mais para there.turn cor exemplo mudança que em escala de cinza .. até agora eu sou capaz de chamar a linha ... aqui é um imagem da linha traçada sobre uma vista UIImage ...
mas eu sou incapaz de descobrir como é que eu tiro no image..mean do ImageView como modificar a imagem de ImageView ???
Também quero restaurar imagem ao clicar no botão Limpar ou algo parecido undo..does alguém sabe como conseguir isso?
e
Como faço para criar um retângulo quando clique no botão colheita mover o retângulo em qualquer lugar na tela ... e então apertar o botão para cortar a imagem ... e, em seguida, Salvar imagem recortada ..
Solução
Estas são as etapas:
- Criar um CGBitmapContext correspondência de cores e dimensões da imagem.
- Desenhar a imagem em que contexto.
- Desenhe o que quiser na parte superior da imagem.
- Crie uma nova imagem a partir do contexto.
- Elimine fora do contexto.
Aqui está um método que leva uma imagem, desenha algo em cima dela e retorna uma nova UIImage com conteúdo modificado:
- (UIImage*)modifiedImageWithImage:(UIImage*)uiImage
{
// build context to draw in
CGImageRef image = uiImage.CGImage;
CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB();
CGContextRef ctx = CGBitmapContextCreate(NULL,
CGImageGetWidth(image), CGImageGetHeight(image),
8, CGImageGetWidth(image) * 4,
colorspace, kCGImageAlphaPremultipliedLast);
CGColorSpaceRelease(colorspace);
// draw original image
CGRect r = CGRectMake(0, 0, CGImageGetWidth(image), CGImageGetHeight(image));
CGContextSetBlendMode(ctx, kCGBlendModeCopy);
CGContextDrawImage(ctx, r, image);
CGContextSetBlendMode(ctx, kCGBlendModeNormal);
// draw something
CGContextAddEllipseInRect(ctx, CGRectInset(r, 10, 10));
CGContextSetRGBStrokeColor(ctx, 1.0f, 1.0f, 1.0f, 0.5f);
CGContextSetLineWidth(ctx, 16.0f);
CGContextDrawPath(ctx, kCGPathStroke);
CGContextAddEllipseInRect(ctx, CGRectInset(r, 10, 10));
CGContextSetRGBStrokeColor(ctx, 0.7f, 0.0f, 0.0f, 1.0f);
CGContextSetLineWidth(ctx, 4.0f);
CGContextDrawPath(ctx, kCGPathStroke);
// create resulting image
image = CGBitmapContextCreateImage(ctx);
UIImage* newImage = [[[UIImage alloc] initWithCGImage:image] autorelease];
CGImageRelease(image);
CGContextRelease(ctx);
return newImage;
}
Para restaurar a velha imagem, basta manter uma referência a ele.
O corte não está relacionado com o exposto, e você deve criar uma nova pergunta para isso.
Outras dicas
Uma solução muito mais fácil seria
(UIImage *) modifyImage:(UIImage *)inputImage
{
UIGraphicsBeginImageContext(inputImage.size);
[inputImage drawInRect:CGRectMake(0, 0, inputImage.size.width, inputImage.size.height);
CGContextRef ctx = UIGraphicsGetCurrentContext();
//Drawing code using above context goes here
/*
*
*/
UIImage *outputImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return outputImage;
}
Dê uma olhada em Visão de Quartz 2D para informações sobre o uso Quartz 2D no iPhone.