2017-01-11 10 views
0

私は、「スコア」(音楽表記法)を生成するために、ブルーで埋め込まれたRhinoインタプリタ(Csoundの音楽合成環境)を使用しています。青ではあなたがこれを行うことができます機能を書き込むことによって、次にやってRhinoのJavaScriptインタプリタ - 関数は未定義を返します

score = myFunction() 

My機能は、オンロードを使用して画像を取得し、スコアを生成するために使用されるピクセル情報を抽出します。問題は私の関数が画像をロードして変数に代入する前にデータを返すのに十分な時間が得られないことです。私はsetTimeout()を使用してみましたが、それは役に立たなかった。

私はブラウザでこれを試しましたが、実際には「未定義」を返します。

基本的に私はスコア変数への割り当てを遅らせる方法が必要です。これは可能ですか?

// Adding a callback function as parameter 
function score(callback){ 
    var img = new Image(); 
    img.src = "http://static.webshopapp.com/shops/023001/files/024718445/256x256x2/major-dog-barbell-mini.jpg"; 
    img.crossOrigin = "Anonymous"; 
    var score = "abc"; 

    img.onload = function(){ 

     var canvas = document.createElement("canvas"); 

     canvas.width = img.width; 
     canvas.height = img.height; 

     var ctx = canvas.getContext("2d"); 
     ctx.drawImage(img, 0, 0); 
     var imgData=ctx.getImageData(0,0,canvas.width,canvas.height); 

     score = "i1 0 2 440 0.5\n" 
     for (var i=0;i<imgData.data.length;i+=4) 
     { 
      score += "i1 + 0.1 " + (imgData.data[i] + 500).toString() + " 0.5\n" 
     } 
     // Now we can run the callback with our score data 
     return callback(score); 

    } 
} 

score(function(score){ 

    console.log(score); 
    // Do your stuff with score data... 

}); 

答えて

0

ありがとう

Blueの場合、実際にはJava 8に組み込まれているNashorn nowを使用しています(新しいBlueリリースではオブジェクトをJavaScriptObjectに変更しました)。

NashornはJSエンジンを提供していますが、わかっている限り、ブラウザで期待されるすべてのAPIは提供していません。私はあなたのコードを実行してデバッグし、定義されていない "ドキュメント"と "イメージ"に関するいくつかの例外がスローされていることを発見しました。私は、次のようなJavaオブジェクトを使用してコードを書き換えました:

function genScore(){ 

    var url = new java.net.URL("http://static.webshopapp.com/shops/023001/files/024718445/256x256x2/major-dog-barbell-mini.jpg"); 
    var img = javax.imageio.ImageIO.read(url); 


    score = "i1 0 2 440 0.5\n" 
    for (var i = 0; i < img.getHeight(); i++) { 
     for (var j = 0; j < img.getWidth(); j++) { 
      var rgb = img.getRGB(i, j); 
      score += "i1 + 0.1 " + (rgb + 500).toString() + " 0.5\n" 
     }; 
    } 
    return score; 
} 
score = genScore(); 

そしてそれはおおよそ働きました。 (私のコードは、正しく理解すればあなたのコードはちょうど赤の値を使用していると思います;このコードはビットマスクで変更し、RGBからR値を得るためにシフトする必要があります; JavaのBufferedImageクラスに関する詳細はhttps://docs.oracle.com/javase/7/docs/api/java/awt/image/BufferedImage.htmlで入手できます)

+0

ブラウザでは魅力的ですが、青では機能しませんが、メインプログラムではscore = myFunction()の形式が必要です。任意の機能)。私はこれを行う方法があると思いますか? – DrumPower3004

+0

非同期呼び出しの性質上、結果を返すためにコールバック関数を使用する必要があります。残念ながら、私はRhinoとBlueプラットフォームに精通していないので、これ以上の助けにはならない。匿名関数の中にscore = myFunction()を配置するか(ここではconsole.log(スコア)が上のコードにあります)、もしあればPromisesの使用を検討する必要があります。 – KostasX

1

(ここではブルーの著者):

は、画像がロードされたときに起動されるスコア関数に渡されるコールバック関数で、あなたが必要なもの

function score(){ 
    var img = new Image(); 
    img.src = "http://static.webshopapp.com/shops/023001/files/024718445/256x256x2/major-dog-barbell-mini.jpg"; 
    img.crossOrigin = "Anonymous"; 
    var score = "abc"; 
    img.onload = function(){ 
     var canvas = document.createElement("canvas"); 
     canvas.width = img.width; 
     canvas.height = img.height; 
     var ctx = canvas.getContext("2d"); 
     ctx.drawImage(img, 0, 0); 
     var imgData=ctx.getImageData(0,0,canvas.width,canvas.height); 
     score = "i1 0 2 440 0.5\n" 
     for (var i=0;i<imgData.data.length;i+=4){ 
      score += "i1 + 0.1 " + (imgData.data[i] + 500).toString() + " 0.5\n" 
     } 
     return score; 
    } 
} 
score = score(); 
// TRY THIS IN BROWSER - RETURNS UNDEFINED 
//console.log(score()) 
+0

さらに、青色のコードはアプリケーションログに例外データを出力するだけなので、これをデバッグするのが難しいようです。私は2.7.0のBlueを修正し、このようなコードの問題をユーザーに報告するようにしました。 –

関連する問題