JAVA2D
是处理中唯一一种PGraphics对象可以用透明背景显示的渲染模式吗(与P2D
和P3D
相反)?我尝试过在其他两种模式下重写我的代码(P3D
,P2D
),但是PGraphics
的背景变得不透明(默认为黑色)——也许我缺少一种将它们变成透明的方法?我在PGraphics
对象中显示的png
如预期的那样变得透明;是PGraphics
的背景不透明。我正在处理一个项目,目前选择了JAVA2D
以保持我的PGraphics
透明,但想知道我是否可以交替使用P3D
及其功能。
从网上看,相信JAVA2D
是在早期版本的处理(1.*)中唯一可以使PGraphics透明的模式,我想知道这是否在版本2中发生了变化?
提前感谢您的澄清和帮助!
更新:
下面是我的代码示例(在Eclipse中编写,Java处理作为组件)。v. k.的回复在处理pde中工作得很好(使用我的png
),但是我没有成功地让它在Eclipse中的项目中工作。想法?:
主要班级:
package tester;
import java.util.ArrayList;
import processing.core.*;
public class GraphicsMain extends PApplet{
int screenWidth = 800;
int screenHeight = 500;
PGraphicsMaker pgm = new PGraphicsMaker(this);
ArrayList<PGraphics> motifArray = new ArrayList<PGraphics>();
public void setup() {
size(screenWidth,screenHeight,P3D);
background(0);
motifArray = pgm.makeMotifArray();
if (motifArray.get(0) == null) {
System.out.println("The motif array is unfilled!");
}
}
public void draw() {
for (int i = 0; i < motifArray.size(); i ++) {
image(motifArray.get(i),200+(10*i),100);
}
}
static public void main(String[] passedArgs) {
String[] appletArgs = new String[] { "GraphicsMain" };
if (passedArgs != null) {
PApplet.main(concat(appletArgs, passedArgs));
} else {
PApplet.main(appletArgs);
}
}
第二类:
package tester;
import java.util.ArrayList;
import processing.core.*;
public class PGraphicsMaker {
String filepath = "/a/filepath/here/";
PApplet parent;
int populationSampleSize = 16;
int stageWidth = 100;
int stageHeight = 400;
ArrayList<PGraphics> motifArray;
PImage pic;
PImage pic2;
public PGraphicsMaker(PApplet pa) {
parent = pa;
pic = parent.loadImage(filepath + "small_jones6.png");
pic2 = parent.loadImage(filepath + "small_dresser10.png");
}
public ArrayList makeMotifArray() {
String filepathTempPngs = "/a/filepath/here/tempPngs/";
ArrayList<PGraphics> motifArray = new ArrayList<PGraphics>();
for (int i = 0; i < populationSampleSize; i++) {
motifArray.add(parent.createGraphics(stageWidth,stageHeight,parent.P3D));
motifArray.get(i).beginDraw();
motifArray.get(i).background(255, 255, 255, 0);
motifArray.get(i).image(pic,10,10,100,90);
motifArray.get(i).image(pic2,10,50,50,50);
motifArray.get(i).endDraw();
motifArray.get(i).save(filepathTempPngs + "motif" + i + ".png");
}
return motifArray;
}
}
注意:我不确定第二个类中的makeMotifArray()
中是否需要最后一个sav()
函数(只是保持透明度的又一次尝试)。
下面的代码在1.5.1和2.0b8中对我有用…如果我没弄错,它正在做你需要的…看看:
PGraphics p;
void setup(){
size(400,400,P3D);
p = createGraphics(400,400,P3D);
smooth();
stroke(180,90,210);
}
void draw(){
background(180,90,210);
p.beginDraw();
p.background(220, 180, 40,0);
p.noFill();
p.stroke(220, 180, 40);
p.translate(width/2 - (width/2 - mouseX), height/2, 400-mouseY*5);
p.sphere(100);
p.endDraw();
pushMatrix();
translate(width/2, height/2, -200);
rotateY(radians(frameCount));
rotateX(radians(frameCount/2));
box(100);
popMatrix();
image(p,0,0);
}