0

私は組み込みの Rhino Interpreter in Blue (Csound の作曲環境) を使用して、「スコア」 (楽譜) を生成しています。青では、関数を書いてから実行することでこれを行うことができます

score = myFunction()

私の関数は onLoad を使用して画像を取得し、スコアの生成に使用されるピクセル情報を抽出します。問題は、私の関数が画像を読み込んで変数に割り当てる前にデータを返すのに十分な時間がないことです。setTimeout() を使用してみましたが、役に立ちませんでした。

これをブラウザで試してみたところ、実際に「未定義」が返されます。

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

ありがとうございました

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())
4

2 に答える 2

0

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

// 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...

});
于 2017-01-11T11:19:03.157 に答える