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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

770閲覧

[Nodejs] sharpライブラリを使用して連続して画像合成を行いたい

退会済みユーザー

退会済みユーザー

総合スコア0

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2022/08/22 11:19

編集2022/08/22 11:22

発生している問題・エラーメッセージ

Error: Cannot use same file for input and output at Sharp.toFile (/node_modules/sharp/lib/output.js:66:11)

該当のソースコード

javascript

1 sorted_paths = [ "./imgs/a.png", "./imgs/b.png", "./imgs/c.png", "./imgs/d.png" ]; 2 3 for (let i = 0; i < maxLayer; i++) { 4 sharp.cache(false); 5 let filename = `./imgs/result/${img_name}${i}.png`; 6 let baseFile = filename; 7 if (i == 0) 8 baseFile = sorted_paths[0]; 9 sharp(baseFile).composite([{ input: sorted_paths[i + 1] }]).toFile(filename, 10 (err, info) => { if (err) throw err; }); 11 }

試したこと

この記事と同じ現象が起きています。このエラーはsharp側に合成素材をキャッシュとして保持しておくために発生しており、それを解決するのはsharp.cache(false)だと書かれていました。それを書き加えましたが引き続きエラーが発生します。

https://stackoverflow.com/questions/57072847/why-does-sharp-output-the-same-file-even-though-i-have-changed-the-input-file

なにか手がかりがありましたらご教示お願いします!

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

これbaseFileがresultフォルダ内にありますね。
100個のファイルがあったら1ファイル目を生成完了してから2ファイル目の生成に取りかかれないはずです。
何度もエラーを出しながら100回施行すれば前提ファイルがいつか出揃って上手く動くかもしれませんが……

Promiseを返す関数化→async/await構文を使うようにして、
1個のファイルの生成を完了させるまで待つという挙動を実現した方が良いでしょう。

以下サンプル

js

1const sorted_paths = [ "./imgs/a.png", "./imgs/b.png", "./imgs/c.png", "./imgs/d.png" ]; 2 3// Promiseを返す関数を準備 4const composite = (base, add, to) => 5 new Promise((resolve, reject) => { 6 sharp.cache(false); // これ本当に使い方合ってるのかなぁ? 7 sharp(base) 8 .composite([{ input: add }]) 9 .toFile(to, (err, info) => { 10 if (err) return reject(err); 11 resolve(info); 12 }); 13 }); 14 15 16// await構文を有効にする為にasync関数で包む、実際のコードは親の関数をasyncにすれば動くと思う 17const main = async () => { 18 for (let i = 0; i < maxLayer; i++) { 19 // 1個生成するまで待つという挙動を再現 20 await composite( 21 (i == 0 ? sorted_paths[0] : `./imgs/result/${img_name}${i}.png`), 22 sorted_paths[i + 1], 23 `./imgs/result/${img_name}${i}.png` 24 ); 25 } 26} 27main();

投稿2022/08/23 03:20

miyabi-sun

総合スコア21158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

2枚の合成を繰り返すのではなく、予めObject型の配列を用意しとくことでこの問題を解決しました

投稿2022/08/22 12:16

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問