我试图想出一种用renderscript作为学习练习来实现马赛克效果的方法,但是我找不到足够的信息来了解这些方法中的哪些方法(如果有的话)可行。
将位图拆分为n×n像素子位图。通过一个平均值为所有像素的脚本运行每个子位图,然后在java中将位图重新加入到一个位图中。我担心如果不同的像素同时更新同一个全局变量,使用forEach_root可能会导致并发问题。我可以使用循环遍历子位图中的每个像素以避免并发问题,但是我会失去forEach_root的好处。
保持原始位图不变并运行forEach_root。在脚本中,如果我可以知道元素的坐标,我可以找出像素应该在哪个方格,然后将每个像素添加到它所在的方格的相对(0,0)。
如果我可以创建仅包含选择像素的分配,那么每个马赛克方块可以有一个像素,并将该方块中的每个其他像素添加到代表像素。这将避免并发问题(如果存在),同时仍然允许多个同时执行
我真的很喜欢3号,但我不确定是否可以创建这样的分配。或者,如果由于不同的renderscript线程同时访问同一个变量而导致的冲突得到优雅处理,那么方法一或两个可能更容易。
答案 0 :(得分:2)
这里的想法有点不同;假设你想为256x256图像创建4x4马赛克;
创建64x64分配以存储每个马赛克片颜色。
在此64x64分配上运行forEach,并将原始256x256分配设置为参数。
在每个forEach迭代中计算ie。原始图像4x4区域的平均颜色,这个马赛克片对应。
在原始256x256分配上运行forEach,并将之前计算的64x64作为参数。
在每个forEach迭代中,将颜色设置为相应的64x64分配颜色。
我认为这种方法应该很容易调整到不同形状和大小的马赛克。只有临时分配的开销。