У меня есть обрезанное изображение (mainImage), которое я разрешаю пользователям рисовать поверх пальцев. Красный циг-заг на экране А. показывает участок, нанесенный пальцем. Прямо сейчас, используя приведенный ниже код, вновь созданный контекст изображения (красный зигзаг) запирается в те же границы, что и обрезанное изображение, и я заканчиваю искаженным зигзагом (снимок экрана Б.). Вы можете видеть, как красный зигзаг был засунут в рамки обрезанного (mainImage).CGContextDrawImage искажает пропорции
То, что я пытаюсь достичь, - это изображение, которое объединяет два контекста из mainImage и drawImage, не искажая пропорции любой фотографии. Так что только фрагменты красного зигзага, которые перекрывают mainImage, будут рисоваться в новом контексте, как на скриншоте C. (фотошоп из результатов, которые я хотел бы). Прямо сейчас, метод commitDrawingWithOpacity: результат с скриншотом B. И мне бы хотелось получить скриншот C.
Я пробовал CGContextClipToRect, CGContextClipToMask, а также попытался создать новый прямоугольник для рисованного изображения, помимо прочего, но до сих пор нет успеха. Я застрял в этом вопросе почти месяц (самообучение), и это одна из последних вещей, которые мне нужно сделать, прежде чем я могу отправить свое приложение на яблоко. Таким образом, любая помощь была бы высоко оценена. Вот ссылка на код, я использую https://github.com/dblapps/DAScratchPad
Вот размер каждого:
drawImage.size = (ширина = 320, высота = 568) // iPhone 5 размер экрана
mainImage.size = (ширина = 260, высота = 800) // размер обрезанного изображения
my imageView настроен на соотношение размеров сторон.
- (void) commitDrawingWithOpacity:(CGFloat)opacity {
UIGraphicsBeginImageContext(mainImage.size);
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextScaleCTM(ctx, 1.0f, -1.0f);
CGContextTranslateCTM(ctx, 0.0f, -mainImage.size.height);
CGRect rect = CGRectMake(0.0f, 0.0f, mainImage.size.width, mainImage.size.height);
if (mainImage != nil) {
CGContextDrawImage(ctx, rect, mainImage.CGImage);
}
CGContextSetAlpha(ctx, opacity);
CGContextDrawImage(ctx, rect, drawImage.CGImage);
mainImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
self.layer.contents = (id)mainImage.CGImage;
drawLayer.contents = nil;
drawImage = nil;
}
Использование функции AVMakeRectWithAspectRatioInsideRect я смог получить правильное соотношение размера для моего mainImage, но до сих пор не было никакой удачи с получением ничего работать правильно.
Ниже Photoshopped скриншот результатов я пытаюсь достичь. Снимок экрана B (выше) - это то, что я получаю с моим текущим кодом.
Thanks! он пытался настроить то, что вы предоставили, но drawImage смещается каждый раз. Я обновил свой вопрос и добавил новый снимок экрана о том, чего я пытаюсь достичь. Когда я использую предоставленный вами код, я получаю отрицательное число для координаты y. Мой mainImage.size.height - 800, а drawImage.size.height - только 568, и я чувствую, что это часть моей проблемы, но не знаю, как начать. –
Возможно, я получил вычитание неправильно. Поскольку ширина 'drawImage' больше, чем' mainImage', вы должны ожидать, что она будет иметь отрицательный 'x'. Поскольку высота 'drawImage' меньше, она действительно должна быть положительной. –
Я понимаю. Но, как видно, высота drawImage составляет 568, а основная высота - 800 .. но изображение не было обрезано высотой вообще. Уравнение вернет целочисленное значение для y, когда фактически y должно быть 0, потому что изображение было обрезано только для ширины. Имеет ли это смысл? –