1

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

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

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

如果我在这里以某种方式使用 Quartz2D,它可能会更快吗?我现在只是试图从我的_image 复制/粘贴一个矩形,但我不知道如何更进一步。它返回一个 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;
4

1 回答 1

2

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

  • 加载图像
  • 怎么把它分成正方形
  • CALayer为每个图像创建一个,在洗牌之前将位置设置为图像中正方形的位置
  • 遍历层,并在洗牌后将它们的位置设置为目标位置
  • 观看方块移动到新位置,如果您不想要动画怎么办?
于 2012-07-03T18:58:33.803 回答