java - 高分辨率处理输出

标签 java

我正在寻求有关编程语言/环境处理的帮助。

我对处理还很陌生,我正在尝试 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();
}

到目前为止,我已经尝试了发布到处理论坛的所谓高分辨率方法,但这对我来说不起作用,至少在我正在使用的上面的代码的上下文中不起作用。以下是论坛中的一段代码,演示了一个用户以高分辨率保存处理输出的方法:

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;
  }
}

编辑:两张屏幕截图,比较实现乔治的白色背景解决方案之前和之后的不同视觉结果:

Before After

最佳答案

您实际上在谈论两件不同的事情:

第一件事:使彩色 Blob 变大。这有点烦人,因为该算法使用像素数组,因此它不像调用 scale() 函数那么简单。

事实上,由于该算法适用于像素,因此任何改变分辨率的简单方法都会变得像素化。

pixelated

您在论坛上获得的解决方案是绘制到屏幕外缓冲区,这实际上不会改变 Blob 的大小。 更改 Blob 大小的唯一方法是更改​​算法。

您也许可以修改操作数组的方式,使 Blob 更大,但老实说,我并不完全理解数组现在在做什么,这使得很难提供帮助。

第二件事:导出为图像。

最简单的方法是调用 save("ImageNameHere.png") 函数。这将创建一个与草图大小相同的图像,其中包含调用该函数时屏幕上显示的所有内容。

您在论坛上找到的解决方案使用离屏缓冲区,但同样:这对 blob 的大小没有帮助。您确实可以使用离屏缓冲区来绘制到比草图窗口大的图像,但这只是您想要的一半。如果你的 Blob 仍然很小,这种方式保存是没有用的!

所以,我给你的建议是首先修复第一件事,然后提出一种生成更大 Blob 的算法。然后我们可以讨论缩放和导出为图像,一旦你让算法工作起来,这将变得非常容易。

关于java - 高分辨率处理输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40350644/

相关文章:

java - jrockit如何定期拍摄内存快照?

java - 在java中打印特定大小的数组

java - 用于字段注释的 Spring Formatter 在 Web Flow 中不起作用

java - Spring JDBC 支持和大型数据集

java - xpath 2.0可以在java中使用吗?

java - handler.postDelayed 不工作(android eclipse)

java - java中的synchronized block 是否真的获取整个对象锁?

java - 将文件名分成组

java - jsp中不同页面的转发

java - spring-boot-maven-plugin :2. 0.0.RELEASE:重新打包失败:无法重命名