Как мне создать новое изображение, рисуя поверх существующего, используя Кварц? - PullRequest
5 голосов
/ 17 сентября 2009

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

alt text

но я не могу понять, как мне нарисовать изображение imageview ... как изменить изображение imageview?

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

и

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

Ответы [ 3 ]

9 голосов
/ 26 сентября 2009

Это шаги:

  1. Создайте CGBitmapContext, соответствующий цветовому пространству и размерам изображения.
  2. Нарисуйте изображение в этом контексте.
  3. Нарисуйте все, что вы хотите в верхней части изображения.
  4. Создать новое изображение из контекста.
  5. Удалите из контекста.

Вот метод, который берет изображение, рисует что-то поверх него и возвращает новый 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;
}

Чтобы восстановить старое изображение, просто сохраните ссылку на него.

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

1 голос
/ 17 мая 2013

Гораздо более простым решением будет

(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;
}
0 голосов
/ 25 сентября 2009

Посмотрите на Обзор Quartz 2D для получения информации об использовании Quartz 2D на iPhone.

...