Последовательное смещение квадратных блоков в UIImage
Я новичок в Objective-C, но мне нужно написать быстрый метод, который будет делить UIImage на квадратные блоки фиксированного размера, а затем смешивать их. Я уже реализовал это следующим образом:
- Получить UIImage
- Представьте это как PNG
- Преобразуйте его в массив RGBA8 без знака
- Для каждого блока вычислите его координаты, а затем зафиксируйте каждый пиксель пикселем из блока, который будет заменен
- Соберите это мясо RGBA8 обратно в новый UIImage
- Верни это
Это работает как задумано, но это очень медленно. Обработка одного PNG-файла 1024x768 на iPhone 4S занимает около 12 секунд. Инспектор показывает, что методы, так или иначе связанные с представлением PNGR, поглощают около 50% общего времени выполнения.
Будет ли это быстрее, если я буду использовать Quartz2D здесь как-нибудь? Сейчас я просто пытаюсь скопировать / вставить один прямоугольник из моего изображения и в него, но я не знаю, как идти дальше. Он возвращает UIImage с _image, предоставленным как есть, без вставленного в него blockLayer:
UIGraphicsBeginImageContextWithOptions(CGSizeMake(width, height), YES, 1.0);
CGContextRef context = UIGraphicsGetCurrentContext();
/* Start drawing */
//Draw in my image first
[_image drawAtPoint:CGPointMake(0,0) blendMode:kCGBlendModeNormal alpha:1.0];
//Here I am trying to make a 400x400 square, starting presumably at the origin
CGLayerRef blockLayer = CGLayerCreateWithContext(context, CGSizeMake(400, 400), NULL);
//Then I attempt to draw it back at the middle
CGContextDrawLayerAtPoint(context, CGPointMake(1024/2, 768/2), blockLayer);
CGContextSaveGState(context);
/* End drawing */
//Make UIImage from context
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
1 ответ
Вы можете выполнить следующие действия, чтобы сделать то, что вам нужно:
- Загрузите изображение
- Разбить его на квадраты как?
- Создать
CALayer
для каждого изображения, устанавливая местоположение на место квадрата на изображении перед перетасовкой - Пройдите слои и установите их позиции в их целевые местоположения после перетасовки
- Смотрите, как квадраты перемещаются на свои новые места, что если вы не хотите анимацию?