【发布时间】:2022-03-10 20:22:55
【问题描述】:
我正在寻求有关编程语言/环境处理的帮助。
我对 Processing 还很陌生,我正在使用来自 openprocessing.org 的某个人的一段代码进行试验。我真的很喜欢这段代码提供的视觉效果,我想进一步使用它。不幸的是,输出的分辨率非常低。因此,我正在寻找能够帮助我弄清楚如何 a) 增加生成的形状的大小或分辨率以及 b) 将所有内容保存为 pdf 文件的人。
您可以在此处找到正在运行的原始代码:https://www.openprocessing.org/sketch/377730
这是代码:
import java.util.Arrays;
float[][] z, v, a;
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void setup() {
size(512, 512);
colorMode(RGB, 2);
z = new float[width][height];
v = new float[width][height];
a = new float[width][height];
loadPixels();
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void draw() {
for (int x = 1; x < width-1; x++) {
for (int y = 1; y < height-1; y++) {
a[x][y] = (v[x-1][y] + v[x+1][y] + v[x][y-1] + v[x][y+1])/4 - v[x][y];
}
}
for (int x = 1; x < width-1; x++) {
for (int y = 1; y < height-1; y++) {
v[x][y] += a[x][y];
z[x][y] += v[x][y];
pixels[width*y+x] = color(sin(z[x][y]) + 1, cos(z[x][y]), 1);
}
}
updatePixels();
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void move() {
if (mouseX > -1 && mouseX < width && mouseY > -1 && mouseY < height) {
v[mouseX][mouseY] = randomGaussian() * TAU;
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void mouseClicked() { move(); }
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void mouseDragged() { move(); }
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void keyPressed() {
noLoop();
for (int x = 0; x < width; x++) Arrays.fill(z[x], 0);
for (int x = 0; x < width; x++) Arrays.fill(v[x], 0);
loop();
}
到目前为止,我已经尝试过一种在 Processing-Forum 上发布的所谓的高分辨率方法,但它并没有为我工作,至少在我正在使用的上述代码的上下文中没有。这是来自论坛的一段代码,它演示了一个用户以高分辨率保存处理输出的输出的方式:
int dim = 5000;
int dimScreen = dim/10;
color c1 = #AFA786;
color c2 = #000000;
void setup() { size(dimScreen,dimScreen); }
void draw() { exampleSketch(); }
void exampleSketch() {
for (int y=0; y<=height; y++) {
stroke(lerpColor(c1,c2,float(y)/height));
line(0,y,width,y);
}
stroke(#FFFFFF);
fill(#BBBBBB);
ellipse(width/2, height/2, width/2, height/2);
line(0, 0, width, height);
}
void keyPressed() {
if (key ==' ') {
g = createGraphics(dim,dim,JAVA2D);
this.height = dim;
this.width = dim;
g.beginDraw();
exampleSketch();
g.endDraw();
save("result.png");
println("screenshot saved");
this.height = dimScreen;
this.width = dimScreen;
}
}
我非常感谢任何精通处理和 Java 的人来帮助我。非常感谢,祝您晚安。
这是我在第一个代码中实现第二个代码的尝试:
import processing.pdf.*;
import java.util.Arrays;
float[][] z, v, a;
int dim = 900;
int dimScreen = dim/10;
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void setup() {
size(900, 900);
smooth(8);
colorMode(RGB, 2);
z = new float[width][height];
v = new float[width][height];
a = new float[width][height];
loadPixels();
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void draw() { exampleSketch(); }
void exampleSketch() {
for (int x = 1; x < width-1; x++) {
for (int y = 1; y < height-1; y++) {
a[x][y] = (v[x-1][y] + v[x+1][y] + v[x][y-1] + v[x][y+1])/4 - v[x][y];
}
}
for (int x = 1; x < width-1; x++) {
for (int y = 1; y < height-1; y++) {
v[x][y] += a[x][y];
z[x][y] += v[x][y];
pixels[width*y+x] = color(sin(z[x][y]) + 1, cos(z[x][y]), 1);
}
}
updatePixels();
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void move() {
if (mouseX > -1 && mouseX < width && mouseY > -1 && mouseY < height) {
v[mouseX][mouseY] = randomGaussian() * TAU;
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void mouseClicked() { move(); }
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void mouseDragged() { move(); }
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void keyPressed() {
if (key ==' ') {
g = createGraphics(dim,dim,JAVA2D);
this.height = dim;
this.width = dim;
g.beginDraw();
exampleSketch();
g.endDraw();
save("result2.png");
println("screenshot saved");
this.height = 900;
this.width = 900;
}
}
编辑:两个屏幕截图比较了在实施 George 的白色背景解决方案之前和之后的不同视觉结果:
【问题讨论】:
-
您能否更具体地说明第二段代码的哪些问题?另外,你的目标是什么分辨率?您希望效果如何扩展?
-
感谢您的快速回复!我尝试将第二个代码中的保存方法实现到第一个代码中(我对处理和 Java 工作原理的了解有限)。我将修改后的代码添加到我上面的原始帖子中。不幸的是,保存的 png 不包含任何内容。
-
您的目标是什么分辨率?您是否希望输出更大,或者草图窗口更大,或者您是否希望草图窗口保持不变但只有更大的颜色斑点?是必须导出为
pdf,还是导出为图片文件没问题? -
我希望使输出更大或颜色斑点更大。基本上,我打算稍后将结果图像带入 Photoshop 并打印(理想情况下,分辨率为 300dpi,图像不会被像素化)。图像文件导出 (.tiff) 或 pdf 都可以。
标签: java