Как создать новое изображение, нарисовав поверх существующего с помощью Quartz?

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

альтернативный текст

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

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

и

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


person Rahul Vyas    schedule 17.09.2009    source источник


Ответы (3)


Вот шаги:

  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;
}

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

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

person Nikolai Ruhe    schedule 26.09.2009
comment
хорошо, ваш код отлично работает. теперь скажите мне, когда я использую кварц для рисования линии, почему он медленный на реальном устройстве. а также расскажите мне, как мне преобразовать изображение в оттенки серого. - person Rahul Vyas; 26.09.2009
comment
Остальные ваши вопросы следует размещать как новые. - person Nikolai Ruhe; 26.09.2009
comment
хорошо, я получил его, чтобы превратить его в серый цвет. теперь есть способ превратить изображение во что-то другое. где на изображении выше есть выделение в виде круга. я имею в виду любой путь - person Rahul Vyas; 26.09.2009
comment
не могли бы вы подробно объяснить свой код. вы такой гениальный человек. - person Rahul Vyas; 26.09.2009
comment
он всегда превращает изображение в серый. даже если я передаю ему цвет. см. код ниже. просто измените свой код в некоторых местах. // рисуем исходное изображение CGRect r = CGRectMake (0, 0, CGImageGetWidth (изображение), CGImageGetHeight (изображение)); CGContextSetBlendMode (ctx, kCGBlendModeCopy); CGContextDrawImage (ctx, r, изображение); // рисуем что-нибудь CGRect rect = CGRectMake (50.0, 50.0, 50.0, 50.0); CGContextAddRect (ctx, rect); CGContextSetRGBStrokeColor (ctx, 0.0f, 1.0f, 1.0f, 0.5f); CGContextSetBlendMode (ctx, kCGBlendModeColor); CGContextFillPath (ctx); - person Rahul Vyas; 26.09.2009
comment
Извините, я не понимаю ваш дополнительный вопрос. - person Nikolai Ruhe; 26.09.2009
comment
я имею в виду, что я переворачиваю ваш код, как я написал выше, но он всегда был серым в заданном прямоугольнике, а красный был изображением. как нарисовать другие цвета. в вашем эллипсе. я имею в виду заливку эллипса желаемым цветом - person Rahul Vyas; 26.09.2009

Намного более простым решением было бы

(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;
}
person zambrey    schedule 16.05.2013

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

person Nick Bedford    schedule 25.09.2009
comment
я прочитал это, но все еще не могу это сделать. это очень сложно - person Rahul Vyas; 25.09.2009