19802


Processing3の`PApplet`のコアをEclipseに移してJava8で開発しています。

`PApplet`の`save(ファイルパス)`を使って画面を保存しようとしているのですが、

[code]

    getSurface().setSize(IWidth, IHeight);
    
[/code]

といった具合で、intの`IWidth`と`IHeight`を縦横の大きさとして、  
任意の大きさの画像を出力したいのですが…

settings()で設定したサイズより大きい(高さもしくは幅どちらかが大きい)状態で出力すると

[code]

    java.lang.ArrayIndexOutOfBoundsException: Coordinate out of bounds!
    
[/code]

と例外を吐かれます…

小さければ問題なく、指定したサイズに出力されます。

対策として、

  1. `settings()`で大きめにサイズ指定→`draw()`で常時使われてる大きさが使われる（？）ようです
  2. `getGraphics().setSize(IWidth, IHeight)`してみる→意味なし
  3. `new PGraphics()`で`PGraphics`を作成して、そこに描画して`PGraphics.save(ファイルパス)`を使う→以下のようなエラーを吐いて、`java.lang.NullPointerException`を投げる…

setMatrix(), or this particular variation of it, is not available with this
renderer.  
pushMatrix() is not available with this renderer.  
resetMatrix() is not available with this renderer.  
popMatrix() is not available with this renderer.  
blendMode(), or this particular variation of it, is not available with this
renderer.

こんな感じです…

* * *

情報としては、

  * `setup()`で`noloop()`を使って、別スレッドで`redraw()`を呼び出している
  * 出力サイズが`settings()`で設定したサイズより小さければ問題なく動く
  * 出力サイズが`settings()`で設定したサイズとアス比が異なっても問題なく動く

ってところです…

* * *

参考までに…  
PApplet
<http://processing.googlecode.com/svn/trunk/processing/build/javadoc/core/processing/core/PApplet.html>  
PGraphics
<http://processing.googlecode.com/svn/trunk/processing/build/javadoc/core/processing/core/PGraphics.html>

載せといてあれなんですが、  
processing3より前と後で、少々メソッドが異なったりしているようです…

公式のEclipseにprocessingを導入する方法  
ttps://processing.org/tutorials/eclipse/  
※信用度の問題でリンクにできませんでした…

* * *

目的は  
`settings()`で設定したサイズより大きい(高さもしくは幅どちらかが大きい)状態で問題なく出力すること

解決に有効な手段としては、

  * `PApplet`か`PGraphics`を`Graphics`等に変換して、java標準のものにして出力
  * `new PGraphics()`での例外とエラーを解決する

などを考えてみましたが、どうにも難しいです…

ちょっとかなり（？）マニアックなことやってて回答どころか理解されるか不安ですが、  
ご助力願います！


CC BY-SA 3.0
2015-12-06T13:20:38.013
19686
2015-12-09T08:56:09.867
13553
question
java java8 processing javafx
PAppletのsaveでの画像出力について…


自己解決しました。

公式の[createGraphics](https://processing.org/reference/createGraphics_.html)の説明に、

[code]

    PGraphics pg;
    
    void setup() {
      size(200, 200);
      pg = createGraphics(100, 100);
    }
    
    void draw() {
      pg.beginDraw();
      pg.background(102);
      pg.stroke(255);
      pg.line(pg.width*0.5, pg.height*0.5, mouseX, mouseY);
      pg.endDraw();
      image(pg, 50, 50); 
    }
    
[/code]

といった具合に、`pg.beginDraw();`で描画を初めて、`pg.endDraw();`で描画完了の様です…  
無事動きました。


CC BY-SA 3.0
2015-12-09T08:56:09.867
19802
2015-12-09T08:56:09.867
13553
19686
answer