#ios #objective_c #swift
Есть ли возможность, стандартная, а если и нет, то скажите, как можно нарисовать
рваную линию, похожу на баллончик, или рваную кисть, которая не полностью зарисовывает
область, а как бы оставляет след. Я реализовываю такую вот штуку. Заранее, спасибо
за помощь.
[Обновление] Задача упростилась, теперь просто нужно узнать как рисовать линию изображением.
Ответы
Ответ 1
Я так понимаю, единственный вариант это накладывать одно и то же изображение снова
и снова, каждый раз, когда курсор смещается.
В том примере, который у вас просто рисуется одно и то же изображение, именно так,
как я описал в комментарии выше. просто изображение необычной формы и по краям, судя
по всему есть полупрозрачные пиксели.
если предположить, что у вас есть заднее изображение и переднее. то вам надо по клику
в переднем изображении создавать прозрачный кусок установленной формы. вот пример с
SO как это сделать
// get access to the image bytes
CFDataRef pixelData = CGDataProviderCopyData(CGImageGetDataProvider(image.CGImage));
// create a buffer to hold the mask values
size_t width = CGImageGetWidth(image.CGImage);
size_t height = CGImageGetHeight(image.CGImage);
uint8_t *maskData = malloc(width * height);
// iterate over the pixel data, reading the alpha value
uint8_t *alpha = (uint8_t *)CFDataGetBytePtr(pixelData) + 3;
uint8_t *mask = maskData;
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
*mask = *alpha;
mask++;
alpha += 4; // skip to the next pixel
}
}
// create the mask image from the buffer
CGDataProviderRef maskProvider = CGDataProviderCreateWithData(NULL, maskData, width
* height, NULL);
CGImageRef maskImage = CGImageMaskCreate(width, height, 8, 8, width, maskProvider,
NULL, false);
// cleanup
CFRelease(pixelData);
CFRelease(maskProvider);
free(maskData);
Потом, чтобы все это запустить сделать:
CGImageRef subtractedImage = CGImageCreateWithMask(b.CGImage, maskImage);
Еще добавлю, что этот фокус скорее всего будет есть очень много ресурсов для большой
картинки. может есть смысл поделить на несколько маленьких.
Ответ 2
Менее ресурсоемким решением было бы использование GLKit, работало бы быстро и на
всех девайсах, но не на всех iOS, кажется начиная с iOS 7. С другой стороны, можно
поиграться с CGPath, UIBezierPath, маской картинкой и получить "почти" тот же результат,
ключевое слово почти :)
UPD: Приведу пару ссылок
Линк 1
Линк 2
Линк 3