objective-c - 在 UIImage 中顺序移动方 block

标签 objective-c ios uiimage quartz-2d cgcontextref

我是 Objective-C 的新手,但我需要编写一个快速的方法,它将一个 UIImage 分成固定大小的方 block ,然后将它们混合。我已经通过以下方式实现了它:

  1. 获取UIImage
  2. 将其表示为 PNG
  3. 将其转换为RGBA8无符号字符数组
  4. 对于每个 block ,计算它的坐标,然后将每个像素与来自被替换的 block 的像素异或
  5. 将 RGBA8 肉组装回新的 UIImage
  6. 归还

它按预期工作,但速度非常慢。在 iPhone 4S 上处理单个 1024x768 PNG 大约需要 12 秒。 Inspector 显示以某种方式连接到 PNGRepresentation 的方法占用了大约 50% 的总运行时间。

如果我在这里以某种方式使用 Quartz2D,它会不会更快?我现在只是想从我的 _image 复制/粘贴一个矩形,但我不知道如何走得更远。它返回一个带有 _image 的 UIImage,其中没有粘贴 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;

最佳答案

您可以按照以下步骤执行所需的操作:

  • 载入图片
  • 把它分成正方形 how?
  • 为每个图像创建一个CALayer,将位置设置为洗牌前图像中正方形的位置
  • 遍历图层,打乱后将它们的位置设置为目标位置
  • 观察方 block 移动到新位置 what if you don't want the animation?

关于objective-c - 在 UIImage 中顺序移动方 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11316807/

相关文章:

iPhone SDK : Image arrays?

ios - 重写后从文件加载图像 - UIImage

ios - 处理并发和异步响应

ios - UICollectionView 在 iOS 11 上覆盖全屏

ios - iOS 上的自定义搜索栏,看起来像普通的 textField

ios - UIActivityViewController 旋转问题

ios - Facebook iOS 登录问题 - 错误代码 2

ios - 从自定义 UITableViewCell 添加和删除自定义 View

objective-c - 使用拖放重新排列时,小圆线条卡在 NSOutlineView 顶部

iphone - 如何将 UIImage 和 UILabel 合并为一张图片并保存