Добавление изображения в текущий контекст UIGraphics - PullRequest
3 голосов
/ 01 июня 2011

У меня есть слайд-шоу, которое позволяет пользователям комментировать слайды с помощью простого инструмента рисования.Просто позволяет рисовать на экране пальцем, а затем «сохранить».Функция сохранения использует UIImagePNGRepresentation и работает довольно хорошо.Мне нужно выяснить, как «продолжить» существующие аннотации, поэтому, когда происходит сохранение, оно также учитывает то, что уже находится на слайде.

Он работает с использованием UIImageContext и сохраняет этот контекст изображения в файл.Когда изображение сохранено, оно открывается в оверлей UIImageView, поэтому, если вы «продолжаете», тогда ваш рисунок в существующий файл png.

Есть ли способ добавить существующее изображение в UIImageContext?Здесь я контролирую добавление линий при движении:

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    if(drawToggle){
        UITouch *touch = [touches anyObject];   
        CGPoint currentPoint = [touch locationInView:self.view];
        currentPoint.y -= 40;

        //Define Properties
        [drawView.image drawInRect:CGRectMake(0, 0, drawView.frame.size.width, drawView.frame.size.height)];
        CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
        CGContextSetLineJoin(UIGraphicsGetCurrentContext(), kCGLineJoinBevel);
        CGContextSetLineWidth(UIGraphicsGetCurrentContext(), 5.0);
        CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), 1.0, 0.0, 0.0, 1.0);
        //Start Path
        CGContextBeginPath(UIGraphicsGetCurrentContext());
        CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y);
        CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), currentPoint.x, currentPoint.y);
        CGContextStrokePath(UIGraphicsGetCurrentContext());
        //Save Path to Image
        drawView.image = UIGraphicsGetImageFromCurrentImageContext();

        lastPoint = currentPoint;
    }
}

Вот волшебная спасительная линия:

NSData *saveDrawData = UIImagePNGRepresentation(UIGraphicsGetImageFromCurrentImageContext());
NSError *error = nil;
[saveDrawData writeToFile:dataFilePath options:NSDataWritingAtomic error:&error];

Спасибо за любую помощь, которую вы можете предложить.

ОБНОВЛЕНИЕ:

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

1 Ответ

9 голосов
/ 02 июня 2011

Я достиг этого, добавив это между моими строками начала и конца:

UIImage *image = [[UIImage alloc] initWithContentsOfFile:saveFilePath];
CGRect imageRect = CGRectMake(0, 0, image.size.width, image.size.height);       
CGContextTranslateCTM(UIGraphicsGetCurrentContext(), 0, image.size.height);
CGContextScaleCTM(UIGraphicsGetCurrentContext(), 1.0, -1.0);
CGContextDrawImage(UIGraphicsGetCurrentContext(), imageRect, image.CGImage);

Context Translate и Scales необходимы, потому что преобразование UIImage в CGImage переворачивает изображение - это происходит потому, что CGImage рисует из левого нижнего начала, а UIImage рисует из верхнего левого начала, те же координаты перевернутая шкала приводит к перевернутому изображению.

Поскольку я нарисовал существующее изображение в UIGraphicsGetCurrentContext() при сохранении файла, он примет это во внимание.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...