Как создать новое изображение, нарисовав поверх существующего с помощью Quartz?
-
08-07-2019 - |
Вопрос
у меня есть представление с помощью uiimageview, я назначаю это изображение uiimageview камерой..теперь я хочу немного нарисовать изображение....используя coregraphics.я хочу сделать что-то вроде этого...выберите область, коснувшись и нарисовав линию, когда линия соединяется с чем-то вроде круга или любой формы.. я хочу изменить эту конкретную область на что-то другое, например, изменить там цвет. превратить ее в оттенки серого..до сих пор я могу рисовать линию... вот изображение линии, нарисованной в представлении uiimage...
но я не могу понять, как мне нарисовать изображение imageview.. имею в виду, как изменить изображение imageview???
также я хочу восстановить изображение при нажатии кнопки «Очистить» или чего-то вроде «Отменить». Кто-нибудь знает, как этого добиться?
и
как создать прямоугольник, нажав кнопку обрезки, переместите прямоугольник в любое место экрана... а затем нажмите кнопку, чтобы обрезать изображение... а затем сохраните обрезанное изображение..
Решение
Вот шаги:
- Создайте CGBitmapContext, соответствующий цветовому пространству и размерам изображения.
- Нарисуйте изображение в этом контексте.
- Нарисуйте все, что хотите, поверх изображения.
- Создайте новое изображение из контекста.
- Избавьтесь от контекста.
Вот метод, который берет изображение, рисует что-то поверх него и возвращает новый UIImage с измененным содержимым:
- (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;
}
Чтобы восстановить старое изображение, просто сохраните ссылку на него.
Обрезка не имеет отношения к вышесказанному, и для этого вам следует создать новый вопрос.
Другие советы
Гораздо более простым решением было бы
(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;
}
Взгляни на Обзор Кварца 2D для получения информации об использовании Quartz 2D на iPhone.