首页 > 解决方案 > 组装大量 PImage 无法正常工作

问题描述

代码重做

我已经使用响应中给出的想法编写了一个新代码,并在一个较小的样本上进行了尝试,但我仍然无法弄清楚为什么我在最终结果中没有删除“头”。

新代码如下所示:

void drawBodyPart(PImage body, PImage bodyPart, String name){
   body.loadPixels();
   bodyPart.loadPixels();
   
   for(int i = 0; i < body.width; i++){
     for(int j = 0; j < body.height; j++){
        int position = i + body.width*j;
        if(alpha(bodyPart.pixels[position]) > 25){
          body.pixels[position] = bodyPart.pixels[position];
        }
     }
   }
   body.updatePixels();
   body.save(folderName + name + ".png");
}

调用方法如下所示:

for(int i = 0; i < humanBodyList.size(); i++){
     for(int j = 0; j < humanHairsList.size(); j++){
         humanBodyList.get(i).loadPixels(); 
         humanBodyList.get(i).updatePixels();
         drawBodyPart(humanBodyList.get(i),  humanHairsList.get(j), "(" + i + "," + j+")");
     }

最后,我将第一个头部正确地绘制在第一组身体上。然后我得到了第一个头,与第二个与身体合并。我什至保存了身体合并的中间产品......我尝试的越多,我就越不了解处理中的 PImages 操作。

----- 下面的旧描述 -----

我正在做一个小小的“Processing 3”项目,我尝试通过将不同的身体部位融合在一起来构建一些角色图像。我有 :

基本上我所做的是将“body1 + head1 + hairs1”合并在一起以获得1个整个角色。

每个子部分图片具有相同的高度/宽度,并且除了我真正感兴趣的部分之外大部分是透明的。因此,我比较了 2 个所述子图片的像素,并根据透明度在生成的图片中保留它们。再次进行下一个身体部位,直到每个身体部位都包含在最终图片中,然后保存。

我对头部、身体和毛发的每一种可能的组合都这样做。循环不是问题(我最后有正确数量的图片)。我的问题是,有些图片是错误的。就像先例图片的缓冲区不为空一样。结果你可以看到角色的头部在前一个头发的一些残留物的前面(见最后的图片)

我的代码如下所示:

void humanAssembly(PImage head, PImage body, PImage hairs, String name){
   PImage result= body;       
   head.loadPixels();
   body.loadPixels();
   hairs.loadPixels();
   corpsAssemble.loadPixels();
   
     //Merging body and head
   for(int i = 0; i < body.width; i++){
     for(int j = 0; j < body.height; j++){
        int position = i + body.width*j;
        if(alpha(hairs.pixels[position]) > 25){
          result.pixels[position] = hairs.pixels[position];
        }else if(alpha(head.pixels[position]) > 25){
          result.pixels[position] = head.pixels[position];
        }
     }
   }       
   body.updatePixels();
   result.save(imagesRepository + "/generes/" + name+ ".png");
}

(显然我的代码效率不高,但我不打算处理超过几百个非常小的图像的可能性,并且这段代码应该运行一次)

调用方法如下所示:(在三元组“for”中)

humanAssembly(listHumanHead.get(i), listHumanBody.get(j), listHumanHairs.get(k), "(" + i + "," + j + "," + k + ")");

其中“listHumanX”是之前成功加载的 ArrayList。

这可能是一些愚蠢的错误,但很长一段时间后我没有找到它的位置,所以如果有人能帮助我,我将不胜感激。提前致谢。任何对我这个可怜的新手有效且可以理解的东西就足够了:)

正确结果:身体 1,头部 1,毛发 1

正确结果:身体 1,头部 1,毛发 2

正确结果:身体 1,头部 2,毛发 2

一个错误的结果:身体 1,头部 2,毛发 1,你仍然可以看到毛发 1(秃头)

标签: imagemergeprocessing

解决方案


推荐阅读