画像を読み取ってクリップボードに書き込んでいる間に表示する簡単なコマンドを作成しようとしています。私が試したことと失敗した理由は次のとおりです。
cat pic.png | tee >(xclip -selection clipboard -t image/png -i) | display -
表示された画像が見えないので失敗します。後ろにxclipプロセスが終了します
maim -s | tee >(display -) | xclip -selection clipboard -t image/png
これも失敗します。なぜなら、画像がクリップボードに保存されるまで保存されないからです。後ろに表示処理が終了する。
maim -s | tee >(display -) >(xclip -selection clipboard -t image/png)
maim -s | tee >(xclip -selection clipboard -t image/png) >(display -)
これら2つも失敗し、それぞれケース1および2と同様に動作します。
一時ファイルに依存しないか、作成した直後にクリップボードを読み取らなくてもこれは可能ですか?
修正する:
sを接続するとtee
奇妙な結果になります。
maim -s | tee >(display -) | tee >(xclip -selection clipboard -t image/png)
この部分は機能してdisplay
画像全体を表示しますが、クリップボードには破損または不完全なコピーのみが含まれています。つまり、GIMPに貼り付けると10%だけ貼り付け、残りは灰色で表示されます。並列例:クリップボードの内容をGIMPに表示して貼り付けます。
maim -s | tee >(xclip -selection clipboard -t image/png) | tee >(display -)
これも部分的に機能し、画像全体がクリップボードに配置されますが、エラーは表示されません。
display: no decode delegate for this image format `' @ error/constitute.c/ReadImage/566.
アップデート2:
まあ、携帯性はもちろん、「エレガントな」方法でこれを行う簡単な方法ではないようです。したがって、最良の方法は3つのステップで行うことです。
- パイプ2本作成
mkfifo /tmp/p1 /tmp/p2
- イメージを取り、そのパイプに書き込みます。
maim | tee /tmp/p1 /tmp/p2
- 両方のパイプで同時に読み取る
display < /tmp/p1 & xclip ... < /tmp/p2
2行にすることもできますが、ポイントがわかります。
別の解決策は、マニュアルページでxclipのフィルタフラグを使用することです。
-f, -filter when xclip is invoked in the in mode with output level set to silent (the defaults), the filter option will cause xclip to print the text piped to standard in back to standard out unmodified
したがって、次のようになります。
maim -s -f png | xclip -i -f -selection clipboard -t image/png | display
これがxclipを使用する最良の方法であり、予想される方法のようです。
ベストアンサー1
データ全体をメモリにある程度バッファリングする必要があります。つまり、tmpファイルに書き込むこともできます/dev/shm
。
別のオプションはバッファプログラムです。
tee <pic.png >(buffer | xclip -selection clipboard -t image/png -i) | display -
buffer
ファイルサイズを事前に確認し、buffer
それに応じてオプションを設定するのに十分なメモリを使用する必要があります。