Последовательное смещение квадратных блоков в UIImage

Я новичок в Objective-C, но мне нужно написать быстрый метод, который будет делить UIImage на квадратные блоки фиксированного размера, а затем смешивать их. Я уже реализовал это следующим образом:

  1. Получить UIImage
  2. Представьте это как PNG
  3. Преобразуйте его в массив RGBA8 без знака
  4. Для каждого блока вычислите его координаты, а затем зафиксируйте каждый пиксель пикселем из блока, который будет заменен
  5. Соберите это мясо RGBA8 обратно в новый UIImage
  6. Верни это

Это работает как задумано, но это очень медленно. Обработка одного 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 для каждого изображения, устанавливая местоположение на место квадрата на изображении перед перетасовкой
  • Пройдите слои и установите их позиции в их целевые местоположения после перетасовки
  • Смотрите, как квадраты перемещаются на свои новые места, что если вы не хотите анимацию?
Другие вопросы по тегам