微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

组装大量 PImage 无法正常工作

如何解决组装大量 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 操作。

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

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

  • 一组“身体”图像:body1.png、body2.png...
  • 一组“头部”图像:head1.png、head2.png...
  • 一组头发(同上)

基本上我所做的是将“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)," + j + "," + k + ")");

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

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

A correct result : body 1,head 1,hairs 1

A correct result : body 1,hairs 2

A correct result : body 1,head 2,hairs 2

An icorrect result : body 1,hairs 1,you still can see the hairs 1 (bald)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。