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

Компилятор должен знать, хотите ли Вы, чтобы он генерировал метода get и/или метод set, или возможно объявляете поле.

5
задан Glorfindel 23 April 2019 в 13:48
поделиться

2 ответа

Вот шаги:

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

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

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

9
ответ дан 13 December 2019 в 22:11
поделиться

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

0
ответ дан 13 December 2019 в 22:11
поделиться