現在、JavaScript で画像編集プログラムを作成しています。JS についてもっと学びたいと思ったので、JS を選びました。私が扱っている平均的な画像は、約 3000 x 4000 ピクセルの大きさです。(ピクセルを編集するために) imageData に変換すると、48000000 の値を処理する必要があります。そのため、Web ワーカーを導入して、配列の n 番目の部分のみを編集できるようにすることにしました。10 人の Webworker がいると仮定すると、各 Worker は 4800000 の値を処理する必要があります。webworkers を使用できるようにするために、選択したスレッドの量で大きな配列を分割しています。私が使用するコードは次のようになります。
while(pixelArray.length > 0){
cD.pixelsSliced.push(pixelArray.splice(0, chunks)); //Chop off a chunk from the picture array
}
後でワーカーが配列で何かを行った後、別の配列に保存します。各ワーカーには ID があり、前述の配列の ID の場所に自分のパートを保存します (配列が正しい順序に保たれるようにするため)。$.map を使用してその配列 ([[1231][123213123][213123123]] のように 1 つの大きな配列 [231231231413431] に連結し、そこから後で必要な imageData を作成します。次のようになります。
cD.newPixels = jQuery.map(pixelsnew, function(n){
return n;
});
この配列 (cD.pixelsSliced) が作成された後、imageData を作成し、このイメージを imageData-Object に次のようにコピーします。
cD.imageData = cD.context.createImageData(cD.width, cD.height);
for(var i = 0; i < cD.imageData.data.length; i +=4){ //Build imageData
cD.imageData.data[i + eD.offset["r"]] = cD.newPixels[i + eD.offset["r"]];
cD.imageData.data[i + eD.offset["g"]] = cD.newPixels[i + eD.offset["g"]];
cD.imageData.data[i + eD.offset["b"]] = cD.newPixels[i + eD.offset["b"]];
cD.imageData.data[i + eD.offset["a"]] = cD.newPixels[i + eD.offset["a"]];
}
今、私はここで膨大な量のデータを扱っており、画像編集にはブラウザを使用するべきではなく、別の言語を使用するべきであることに気付きました (私はユニで Java を使用しています)。しかし、初めて大きな画像を試したときは率直に言ってかなり驚いたので、パフォーマンスに関するヒントがあれば教えてください。画像をロードするのに「それ」ほど時間がかかるとは思いもしませんでした(コードの最初の平和)。Firefox は実際に私のスクリプトが壊れていると考えています。コードの他の 2 つの部分は、スクリプトの速度を低下させることがわかった部分です (これは正常です)。ええ、私はどんなヒントにも感謝します。
ありがとうございました