Страницы

Поиск по вопросам

четверг, 9 апреля 2020 г.

Как нарисовать рваную линию?

#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

Комментариев нет:

Отправить комментарий