質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.62%

  • Java

    13524questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Processing

    245questions

    Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

Proccesingでfillとrectだけで画像描画したい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 93

rikurumu

score 2

processing(JAVA)で265×300の画像をfillとrectだけで描画したいです。(こんなことする意味があるのかは置いといて)

int x=0;
int y=0;

fill(-6052883);
rect (x + 0,y + 0,1,1 );
fill(-6053138);
rect (x + 1,y + 0,1,1 );
fill(-6053388);
rect (x + 2,y + 0,1,1 );
fill(-6053387);
rect (x + 3,y + 0,1,1 );
fill(-6053641);
rect (x + 4,y + 0,1,1 );
fill(-6119693);
rect (x + 5,y + 0,1,1 );
fill(-6054160);
rect (x + 6,y + 0,1,1 );
fill(-5923090);
rect (x + 7,y + 0,1,1 );
fill(-5923605);
.
.
.
と、こんな感じで40万行近くになりましたがいざ実行してみるとエラーコードやらが出る前にprocessingが動かなくなります。
processingのスペルも覚えてない超初心者ですが解決策を教えていただけませんでしょうか……

追記 エラーコード出てました
Exception in thread "TimerQueue" Exception in thread "Thread-64" Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: Java heap space

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    退会済みユーザー

    2018/05/19 14:19 編集

    このパターンで1ドットごとにrectとfillを実行するとして、256×300×2行≒16万行程度にしかなりませんが、残りの24万行は何をしているのでしょうか? rectとfillの呼び出しだけでそんなにメモリを消費するとは思えません。

    キャンセル

  • rikurumu

    2018/05/19 17:56

    すみませんなぜか二回ループしてましたが解決しました

    キャンセル

回答 1

checkベストアンサー

+1

計算機のパワーには限界があります。それはスピードだったり、メモリーやハードディスクの容量などハードウェア的な制約であったり、OSなどのソフトウェア的な制約(同時に開くことができるファイルの数は1000個までとか・・・)であったりします。

その制約の下で効率よく動くようにプログラミングするのが常道です。

もし使っている計算機に何テラ・何ペタものメモリーと超高速なプロセッサーを搭載しているなら40万行のコードもなんなく実行できるかも知れません。しかし例えば8GBしか主記憶が搭載されてない計算機で実行しようとすると、1行あたりのJavaのバイトコードが仮に20バイトぐらいメモリーを消費するとすれば40万行で8GBにも達します。単なるバイトコードだけでそれだけになるとJavaのオブジェクトを格納しておくべきヒープやらProcessing以外にOS配下で動いているもろもろのプログラムが「スムーズに動けなくなる」ことは想像に難くありません。

こんなことする意味があるのかは置いといて

それはかまわないのですが、40万行はナンセンスな分量と言えましょう。少なくともコードの中に直接定数を並べて同じような処理を並べるのは止めましょう。こういうものは可変の部分を計算によって求めたり、外部のファイルへ置くなどして「プログラムコード自体は小さく」書くのが普通です。


訂正:
40万行のバイトコードの試算を間違えて8GBと計算してしまったため、ちょっと変なところに着目して回答してしまいました。失礼しました。

プロセッシングがフリーズ(?)した直接原因は不明ですが、少なくともJVMの仕様制限にひっかかるぐらいメソッドが大きすぎるのは確実と思います。1万行ぐらいでやってみましたが、Javacでコンパイルするとコンパイル時に「コードが大きすぎます」というコンパイルエラーになりますね。

しかしながら、「何万行ものコードを書くのはよくない」という点は同じでそれが回答の要点であると受け取ってください。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/19 14:59

    20バイト×40万行=8Mバイトなのでは?

    キャンセル

  • 2018/05/19 15:02

    これはしたりw;
    ご指摘ありがとうございます。
    本文の説明を書き直さないといけないレベルですね・・・

    キャンセル

  • 2018/05/19 15:07

    コンパイル後のメソッドサイズが64Kバイトを超えると実行時にエラーとなるようです。

    キャンセル

  • 2018/05/19 15:16

    そんなエラーに遭遇するのはなかなかないですよねw;
    javacでやってみるとコンパイル時にエラーになりました。
    J.java:4: エラー: コードが大きすぎます

    キャンセル

  • 2018/05/19 18:00

    返信遅くなり申し訳ありません。
    そうですよね、さすがにあれだけ多いのは無理ですよね笑
    最終的に下のように画像を解析しながら描画することにしました
    お二方ともありがとうございました!

    PImage img;
    //画像の下準備
    int i =0; //x座標
    int j =0; //y座標

    void setup() {
    img = loadImage("miku.jpg");
    //スケッチフォルダのdataフォルダに画像を入れ、その画像ファイルの名前を入力
    size(401, 258);
    //画像ファイルの横サイズの二倍の数値と縦サイズの数値を入力
    //この先入力不要
    noStroke();
    }

    void draw() {
    img.loadPixels();
    //画像ファイルのピクセル情報を読み込む
    for (int j= 0; j <height; i =0) {
    //上から一行ずつ処理
    for (int i= 0; i <width/2; i ++) {
    fill(img.pixels[(j*width/2+i)]);
    //描画しようとしている色を取得
    rect(i, j, 1, 1);
    //ドットを描く
    //これを一行すべて描画した後、次の行へ
    }
    j ++;
    }
    noLoop();
    //ループさせない
    }

    キャンセル

  • 2018/05/19 18:06

    簡単に画像を描画できるメソッドがあることはご存知でしょうけども、おそらく画像を加工して何かするといった想定があって、こうした低水準な処理に取り組んでおられるのだと思います。
    こういう研究は大事と思います。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.62%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    processing 描画について

    processingでこれを描こうと思い size(600,600); background(0); strokeWeight(10); int p ; int a 

  • 受付中

    processing 秒数指定

    前提・実現したいこと 発生している問題・エラーメッセージ processingを使っています。4分後に消したい絵と4分5秒後に消したい絵が二つ並んでいます。最初delayを二つ

  • 受付中

    Javaでのアニメーションづくり

    前提・実現したいこと ここに質問したいことを詳細に書いてください Javaで400×400マスで https://gyazo.com/6aec450c3aec1d9e2c54

  • 解決済

    ruby-processingは遅い?

    Ruby-ProcessingというProcessingをRubyでラップしたものを最近知りまして、使ってみたんですが、Processingに比べて、格段に遅いです。 drawの

  • 解決済

    カーソルがある物体(四角形など)に触れた時に色を変えるプログラムを

    現在、Processingのexampleで紹介されていたSpringというコードを改良して、様々な図形の色がそれぞれ、カーソルが触れた時に色を変えるというプログラムを書いています

  • 解決済

    processing 配列を用いなければならない

    前提・実現したいこと processingのプログラムにおいて、出口へと向かうプログラムを作成しています。このプログラムを配列を用いて球体を複数にしなければならないのですが、やり方

  • 解決済

    Processing実行中のCPU使用率が異常に高い

    Processing実行中にタスクマネージャーを見てみると、Java(TM) Platform SE binaryが常に30%以上ものCPUを使っています。数行程度の簡単なコードで

  • 解決済

    6個の球をよけるゲームを作りたい

    ネットや教科書を参考にして作ってみたのですが、まったく違ったプログラムができあがってしまいました。 ゲームの内容は6つの球をよけるというものです。しかし、できたのはペイントのよ

同じタグがついた質問を見る

  • Java

    13524questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Processing

    245questions

    Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。