スクリーンキャプチャーのファイル形式について

MacOSはYosemiteです。


スクリーンキャプチャー画像のファイル形式についてです。

直接クリップボードにコピーする形(ctrl+shift+command+4)で文書ファイルに貼り付けていたのですが、

画像形式がtiffとなってしまうため文書ファイルのサイズがどうしても大きくなってしまいます。

jpg等の別の形式にしたいのですがいい方法はありますでしょうか。


デスクトップに一旦保存する方法はwebに載っていましたが、その方法でもctrl+shift+command+4の時はtiffとなってしまいます。

デスクトップに一旦保存する方法は直接添付ほど容易ではないため別の方法があればと思いましてお尋ねしました。


よろしくお願いいたします。

MacBook Pro with Retina display, OS X Yosemite (10.10.3)

投稿日 2015/06/18 07:24

返信
返信: 15

2015/06/18 08:14 nejimakdiri55 への返信

文書に貼り付けた画像なら、そのデータをどう扱うかは文書ソフトによることで画像ファイル形式は関係ない(ユーザが関与することはできない)のでは?

文書の中に貼り付ける画像なら、一般的にはあまり大きな解像度の画像である必要はないと思われますので、文書ファイルのサイズを小さくしたいなら、あらかじめ画素数を減らして小さな画像にしたものを貼り付けるなどする方(必要以上に大きなサイズの画像を貼り付けないようにする)が効果的なのでは?最近のディスプレイは解像度が大きい(画素数が大きい)ので、普通にコピー&ペーストするとかなり大きな解像度の画像をそのおまま貼り付けることになります。

2015/06/18 08:43 はに への返信

お返事いただきありがとうございました。


やはり、画像のファイル形式は文書ファイル内で保存されているようです。


言葉足らずですいません。

なぜこのような事態になったかと申しますと、

テキストエディタで画像付き文書を作成(rtfd)していたのですがiphoneでどうしても閲覧できないということに気がつきました。

dropboxで開いてみると、画像ファイルが分離されて表示されます。

これはrtfdの宿命のようなのでNotesで同期しようと考えました。

ところが今度はファイルサイズが大きすぎるため同期が困難であることが判明しました。

jpgで作り直したファイルはなんとか同期できたためjpgで貼り付けできればなぁと考えた次第です。


やはり画像付き文書のクラウド利用はPagesなどを使用するのが常套手段なのでしょうか。

長文失礼いたします。

2015/06/18 09:02 nejimakdiri55 への返信

TextEdit の書類に、画像ファイルをドラッグアンドドロップ (ペーストではなく) して保存してみてはどうでしょう?当方の環境 (Leopard と Snow Leopard) では、この方法だと元のファイル形式で保存されますし、ファイルサイズも巨大にはなりません。ちなみに、ペーストだと nejimakdiri55 さんと同様に tiff となり、ファイルサイズが巨大になります。

2015/06/18 09:55 Hiro__S への返信

お返事ありがとうございました。


そうですね、tiffはどうしてもファイルサイズが大きくなってしまいますよね

おっしゃる通り直接ドラッグアンドドロップする方法は確実だと思います。

デスクトップ等に画像ファイルを作らないでスクリーンキャプチャー画像のクリップボードからの直接ペーストがjpg等でできればよいのですが。

2015/06/18 19:40 nejimakdiri55 への返信

デスクトップ等に画像ファイルを作らないでスクリーンキャプチャー画像のクリップボードからの直接ペーストがjpg等でできればよいのですが。


ちょっと調べた限りでは、できそうにないです...。


で、代替案として、こんな感じの Automator アプリケーションでどうでしょうか?


使い方は、RTFD ファイルをアプリにドロップするか、アプリをダブルクリックで起動し、ダイアログから RTFD を選択 (複数選択可)。そうすると、RTFD 内にある「Pasted Graphic.tiff」を「Pasted Graphic.jpg」に変換し、TXT.rtf をそれに合わせて書き換えます。


RTF の書き換えはもうちょっとちゃんとやった方が良いかもしれませんが、手元で確認したところ大丈夫そうなので、簡単な方を載せておきます。


なお、動作確認は Snow Leopard。Yosemite で動かない場合は、どなたか修正していただけるとうれしいです。


ユーザがアップロードしたファイル

AppleScript を実行

property msg : "RTFD ファイルを選択してください" on run {argv} if (count argv) < 1 then set uti to "com.apple.rtfd" set loc to path to desktop set argv to choose file of type uti with prompt msg ¬ default location loc with multiple selections allowed end if return argv end run


シェルスクリプトを実行

/bin/bash 引数として

if [ $# -lt 1 ]; then exit; fi for i in "$@" do if [ "${i##*.}" != "rtfd" ]; then continue; fi # backup: fname.rtfd => fname~bak.rtfd cp -pR "$i" "${i%*.rtfd}~bak.rtfd" ( cd "$i" || exit 1 for f in *.tiff do if [[ ! "$f" =~ ^Pasted\ Graphic\ ?[0-9]*\.tiff$ ]]; then continue; fi cur="${f}" new="${f%*.tiff}.jpg" res=$(sips -s format jpeg --out "${new}" "${cur}" 3>&1 >/dev/null 2>&3) if [ -z "${res}" ]; then rm "$f" perl -i -pe 's|(\\NeXTGraphic Pasted Graphic ?[0-9]*)\.tiff|$1.jpg|g' "TXT.rtf" fi done ) echo "$i" done


AppleScript を実行

property msg1 : "処理が完了しました。" property msg2 : "項目はありませんでした。" property msg3 : "他 “" property msg4 : "項目”" on run {argv} try set argc to count argv if argv is {""} then set msg to msg2 else if argc < 11 then set msg to join(10, argv) else set msg to join(10, items 1 thru 10 of argv) & return & ¬ msg3 & (count of items 11 thru end of argv) & msg4 end if using terms from application "Finder" display alert msg1 message msg end using terms from on error err_msg number err_num display alert "Error!" message err_num & ": " & err_msg as warning end try end run -- subroutine: join(n, ary) -- tab:9 cr:13 nl:10 space:32 period:46 comma:44 slash:47 on join(n, ary) set ifs_org to text item delimiters of AppleScript set text item delimiters of AppleScript to character id (n) set str to ary as text set text item delimiters of AppleScript to ifs_org return str end join

2015/06/18 22:59 Hiro__S への返信

なるほど、やはり設定変更では対処できないのですね。


すごいですね、短時間にこのAutomatorのスクリプトを作成するなんて。

活用させていただきます。

設定変更できないことをプログラミングで対応できるよう私ももっと勉強してみます。

このような質問に真摯に対応していただきとても感謝しております。

勉強になりました。

ありがとうございました。

2015/06/19 02:32 nejimakdiri55 への返信

修正版です。分かりやすいように全部載せておきますが、「シェルスクリプトを実行」のみの差し替えで大丈夫です。


AppleScript を実行

property msg : "RTFD ファイルを選択してください" on run {argv} if (count argv) < 1 then set uti to "com.apple.rtfd" set loc to path to desktop set argv to choose file of type uti with prompt msg ¬ default location loc with multiple selections allowed end if return argv end run


シェルスクリプトを実行

/bin/bash 引数として

if [ $# -lt 1 ]; then exit; fi for i in "$@" do if [ "${i##*.}" != "rtfd" ] || [ ! -d "$i" ]; then continue; fi # backup: fname.rtfd => fname~YmdHMS.rtfd cp -pR "$i" "${i%*.rtfd}~$(date '+%Y%m%d%H%M%S').rtfd" 2>/dev/null || continue ( cd "$i" 2>/dev/null || continue for f in *.tiff do if [[ ! "$f" =~ ^Pasted\ Graphic\ ?[0-9]*\.tiff$ ]]; then continue; fi cur="${f}" new="${f%*.tiff}.jpg" res=$(sips -s format jpeg --out "${new}" "${cur}" 3>&1 >/dev/null 2>&3) if [ -z "${res}" ]; then if [ -f "$f" ]; then rm "$f"; fi perl -i -pe 's|(\\NeXTGraphic Pasted Graphic ?[0-9]*)\.tiff|$1.jpg|g' "TXT.rtf" fi done ) echo "$i" done


AppleScript を実行

property msg1 : "処理が完了しました。" property msg2 : "項目はありませんでした。" property msg3 : "他 “" property msg4 : "項目”" on run {argv} try set argc to count argv if argv is {""} then set msg to msg2 else if argc < 11 then set msg to join(10, argv) else set msg to join(10, items 1 thru 10 of argv) & return & ¬ msg3 & (count of items 11 thru end of argv) & msg4 end if using terms from application "Finder" display alert msg1 message msg end using terms from on error err_msg number err_num display alert "Error!" message err_num & ": " & err_msg as warning end try end run -- subroutine: join(n, ary) -- tab:9 cr:13 nl:10 space:32 period:46 comma:44 slash:47 on join(n, ary) set ifs_org to text item delimiters of AppleScript set text item delimiters of AppleScript to character id (n) set str to ary as text set text item delimiters of AppleScript to ifs_org return str end join

2015/06/19 06:12 nejimakdiri55 への返信

スクリーンキャプチャの画像形式が pdf でもよければ、下記のシェルスクリプトが使えると思います。



#!/bin/bash screencapture -i -c -t pdf



これは control + command + shift + 4 と同様に選択範囲のスクリーンキャプチャを取得して、pdf 形式でクリップボードに置きます。OS X 10.6.8 でテストした限りでは、pdf データをクリップボードに置いても、tiff データが自動的に生成されてクリップボードに置かれることはないです。


尚、jpeg 等のビットマップ形式の画像をクリップボードに置くと、自動的に tiff 形式の画像も置かれてしまうのは、NSPasteboard の仕様だと思います。


又、複数のタイプのデータがクリップボード上にある場合にどのタイプのデータを取得するかは、ペーストする側のアプリケーションが決めることなので、この場合は、テキストエディットがクリップボード上のデータの配置順にかかわらず、無条件に tiff を優先しているということでしょう。


つまり、クリップボードの I/O のレベルでは、今回のケースでユーザがコントロールできることはほとんどないです。

2015/06/19 09:15 chandana への返信

お返事いただきありがとうございました。


NSPasteboardクラスになるとユーザーからは設定変更ができない、仕様なのですね。

なるほど、知識不足が身にしみます・・・(ー ー;)

ありがとうございました、今後に活かさせていただきます。

2015/06/20 00:57 nejimakdiri55 への返信

ctrl+shift+command+4ではなく、shift+command+4でやる方法を考えてみた。

フォルダアクションできない訳じゃないけど遅い(笑)です。

あとデスクトップに使い残しのファイルが残る。

流れはスクリーンショットしたのをjpgに変換してプレビューで開いてすべてを選択してコピーしてプレビューを閉じる。

あとはペーストするだけです。


あと同じ形式(ここではpng)のファイルがデスクトップに落ちるとすべて同じ挙動をしてしまうのが難です。

それを解決させようとすると益々遅くなるので、考えるのやめました。


遊びで考えてみただけで、参考までということでした。


ユーザがアップロードしたファイル

ユーザがアップロードしたファイル

2015/06/20 06:56 お子様ランチ. への返信

nejimakdiri55様

標準の設定ではスクリーンキャプチャーの保存フォーマットの変更はできないようなので、

標準ではないアプリを使って変えています。

TitaniumSoftwareという会社がリリースしています「Deeper」というアプリです。

MacOSの隠し機能を変更ることの出来るアプリなので、十分な注意が必要と思います。

具体的には、Deeperを起動し、(システムに変更を加えるので)管理者ユーザーの名前と

パスワードを入力し、「OK」します。するとアプリが立ち上がり、Deeperの

使用許諾契約が表示されるので、「同意する」をクリックします。

そうすると、隠し機能を変更できる画面が表示されるので、

「一般」タブをクリックすると、画面の中央部に「スクリーンキャプチャの形式」

と表示されるので、適当なファイル形式を選びます。

「警告」画面が表示れるので「続ける」をクリックすると選択したファイル形式で

スクリーンキャプチャが保存されます。

2015/06/20 19:05 Penetration への返信

スクリーンショットの保存形式は Terminal から変更することも出来ます。


保存形式を JPEG にする

defaults write com.apple.screencapture type jpg && killall SystemUIServer


保存形式を PDF にする

defaults write com.apple.screencapture type pdf && killall SystemUIServer


設定を削除する (デフォルトに戻す)

defaults delete com.apple.screencapture type && killall SystemUIServer


問題はその先にあって、TextEdit の書類に PNG 形式や JPEG 形式の画像をペーストして保存すると、RTFD ファイル内に保存される画像データが TIFF 形式となってしまい、ファイルサイズが肥大化するということかと。その原因は chandana さんがお書きのとおりだと思います。

2015/06/20 20:08 Hiro__S への返信


問題はその先にあって、TextEdit の書類に PNG 形式や JPEG 形式の画像をペーストして保存すると、RTFD ファイル内に保存される画像データが TIFF 形式となってしまい、ファイルサイズが肥大化するということかと。

あぁ、そういうことでしたか。

テキストエディトは標準形式でしか使ってたので、他のアプリケーションで検証してたので気がつきませんでした。

2015/06/27 01:09 Hiro__S への返信

何度もすみません。再修正版です。今回も「シェルスクリプトを実行」のみの差し替えで構いません。問題点の修正に加え、挙動も若干変更し、すべての TIFF ファイルを変換するようにしました。


また、「シェルスクリプトを実行」で fmt = 'jpeg' のところを fmt = 'png' と書き換えると、TIFF ファイルを PNG ファイルに変換するようになります。なお、pdf の指定は不可です。


AppleScript を実行

property msg : "RTFD ファイルを選択してください" on run {argv} if (count argv) < 1 then set uti to "com.apple.rtfd" set loc to path to desktop set argv to choose file of type uti with prompt msg ¬ default location loc with multiple selections allowed end if return argv end run


シェルスクリプトを実行

/bin/bash 引数として

python <<'EOF' - "$@" # -*- coding: utf-8 -*- import sys, os from datetime import datetime from subprocess import Popen, PIPE, check_call def cp(opt, src, dst): cmd = ['cp', opt, src, dst] check_call(cmd) def sips(fmt, src, dst): cmd = ['sips', '-s', 'format', fmt, '--out', dst, src] proc = Popen(cmd, stdin = PIPE, stdout = PIPE, stderr = PIPE) out, err = proc.communicate() if err: raise Exception(err) def main(fmt, new_ext): if len(sys.argv) < 2: quit() now = datetime.now().strftime('%Y%m%d%H%M%S') for rtfd in [os.path.abspath(x) for x in sys.argv[1:]]: if not os.path.isdir(rtfd): continue rtfd_dname, rtfd_bname = os.path.split(rtfd) rtfd_fname, rtfd_ext = os.path.splitext(rtfd_bname) if rtfd_ext != ".rtfd": continue rtfd_backup = os.path.join(rtfd_dname, rtfd_fname + '~bk_' + now + rtfd_ext) cp('-pR', rtfd, rtfd_backup) os.chdir(rtfd) for f in os.listdir(rtfd): fname, ext = os.path.splitext(f) n = 1 if ext != '.tiff': continue if not os.path.isfile(fname + new_ext): new_f = fname + new_ext else: new_f = fname + ' ' + str(n) + new_ext while os.path.isfile(new_f): if n > 1000: raise Exception("filename: overflow") n += 1 new_f = fname + ' ' + str(n) + new_ext sips(fmt, f, new_f) os.remove(f) fh = open('TXT.rtf', 'r+') text = fh.read() text = text.replace('\\NeXTGraphic ' + f, '\\NeXTGraphic ' + new_f) fh.seek(0) fh.write(text) fh.truncate() fh.close() print rtfd if __name__ == '__main__': dct = {'jpeg' : '.jpg' , 'png' : '.png' , 'psd' : '.psd'} # # jpeg | png | psd # fmt = 'jpeg' main(fmt, dct[fmt]) EOF


AppleScript を実行

property msg1 : "処理が完了しました。" property msg2 : "項目はありませんでした。" property msg3 : "他 “" property msg4 : "項目”" on run {argv} try set argc to count argv if argv is {""} then set msg to msg2 else if argc < 11 then set msg to join(10, argv) else set msg to join(10, items 1 thru 10 of argv) & return & ¬ msg3 & (count of items 11 thru end of argv) & msg4 end if using terms from application "Finder" display alert msg1 message msg end using terms from on error err_msg number err_num display alert "Error!" message err_num & ": " & err_msg as warning end try end run on join(n, ary) # # tab:9 cr:13 nl:10 space:32 period:46 comma:44 slash:47 # set ifs_org to text item delimiters of AppleScript set text item delimiters of AppleScript to character id (n) set str to ary as text set text item delimiters of AppleScript to ifs_org return str end join


ーーーーー


さて、RTFD 内にある「TXT.rtf」では、異なるテキストエンコーディングが混在する場合があり?、スクリプトで編集するのはちょっとマズいかもしれません。手元のファイルで試した限りでは大丈夫のようですが、ちょっと心配です。


その点では、chandana さんがお書きのように screencapture コマンドでスクリーンショットを PDF 形式でクリップボードにコピーする方法が安全です。


ということで、こんな感じの AppleScript (スクリプト形式) にして、OS のメニューバーから実行するのも良いでしょう。


property fmt : "pdf" on run tell application id get_frontmost_application() to activate do shell script "screencapture -ic -t " & fmt end run on get_frontmost_application() tell application "System Events" get processes whose frontmost is true and visible is true return bundle identifier of item 1 of result end tell end get_frontmost_application


※ 動作確認は Mac OS X 10.6.8 です。

このスレッドはシステム、またはAppleコミュニティチームによってロックされました。 問題解決の参考になる情報であれば、どの投稿にでも投票いただけます。またコミュニティで他の回答を検索することもできます。

スクリーンキャプチャーのファイル形式について

Apple サポートコミュニティへようこそ
Apple ユーザ同士でお使いの製品について助け合うフォーラムです。Apple Account を使ってご参加ください。