image - 组装大量 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”项目,我尝试通过将不同的身体部位融合在一起来构建一些角色图像。我有 :
- 一组“body”图像: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), "(" + i + "," + j + "," + k + ")");
其中“listHumanX”是之前成功加载的 ArrayList。
这可能是一些愚蠢的错误,但很长一段时间后我没有找到它的位置,所以如果有人能帮助我,我将不胜感激。提前致谢。任何对我这个可怜的新手有效且可以理解的东西就足够了:)
解决方案
推荐阅读
- c - 如何制作一个从二维数组中删除同一组值的程序?
- android - 我的 Cast 应用程序在后台时如何播放声音?
- javascript - 如何从 javascript 中获取价值
- kubernetes - 如何在 v3.2.1 中列出有关 helm search url 的完整 url
- java - SAP Cloud SDK (Java) 在 SuccessFactors 元数据加载时引发命名错误异常
- flutter - 扩展的小部件出现异常(每个孩子必须恰好布置一次)?
- python - Django:如何显示两个或三个模型的数据
- java - 无法加载 servlet 过滤器类:com.sap.cloud.sdk.cloudplatform.security.servlet.HttpSecurityHeadersFilter (SCP Neo)
- javascript - next 和 JWT 认证组件
- amazon-web-services - 当我启动 AWS Cloudformation 并注销我的账户时会发生什么?