在 UIImage 中按顺序移动方块

Posted

技术标签:

【中文标题】在 UIImage 中按顺序移动方块【英文标题】:Sequentially shift square blocks in UIImage 【发布时间】:2012-07-03 18:18:01 【问题描述】:

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

    获取 UIImage 将其表示为 PNG 将其转换为 RGBA8 无符号字符数组 对于每个块,计算其坐标,然后将每个像素与被替换的块中的像素进行异或操作 将 RGBA8 肉重新组装到新的 UIImage 中 退货

它按预期工作,但速度极慢。在 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;

【问题讨论】:

【参考方案1】:

您可以按照以下步骤做您需要的事情:

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

【讨论】:

嗯,但是速度呢?通常有 12000 多个正方形,每个正方形 8 x 8 像素。 @Kai 12000 我没有意识到碎片这么小。对于数百层,这应该没问题,但我不确定它是否适用于 12000;如果结果太慢,我不会感到惊讶。您是否尝试针对位图在屏幕外运行您的算法? 是的,我在我的生产代码中做到了,我在其中操作了一个原始字节数组。在那里,块坐标重新映射逻辑非常快,但数据准备功能使用大量时间来解压缩/压缩 PNG 数据。我认为可能有一种更快的方法可以在 UIImage 中裁剪和粘贴正方形。

以上是关于在 UIImage 中按顺序移动方块的主要内容,如果未能解决你的问题,请参考以下文章

swift UIImage蓝色方块

仅将 UIImage 移动到另一个 UIImage 内

UIImage 显示为不透明的正方形(IOS Swift)

使用核心动画在屏幕上移动 UIImage

在核心动画中,红框代替 UIImage 视图移动

在 iOS 中使用 UIPanGestureRecognizer 时尝试限制 UIImage 的移动