Update Mr Wizard's answer はピクセル パーフェクトな結果をもたらしますが、これは Windows のみであり、クリップボードの内容を破壊します。私の答えはどのプラットフォームでも機能するはずですが、正確ではありません。たとえば、In/Out ラベルが省略されています。ただし、ラスタライズ幅を設定することはできます。
この問題は、画像アップローダーのプレビュー ウィンドウを作成しようとしたときに発生しました(その回答の最後を参照してください)。
現在のノートブックの選択を画像としてアップロードするパレット ボタンを作成したいと思います。アップロードする前に、画像のプレビューを表示して、サーバーに接続する前に問題が発生する可能性を減らしたいと思います。
これは私がこれまでに持っているものです(アップローダーではなく、プレビューコードのみが含まれています):
button = Button[
"Preview",
Module[
{expr = NotebookRead@InputNotebook[]},
If[expr =!= {},
With[{img = Rasterize[expr]},
MessageDialog[
Column[{"Would you like to perform the action?", img}],
{"Do it!" :> doIt[img], "Cancel" :> Null}
]
]
]
]
]
モジュール変数を作成する代わりに、With
内部でネストされたものを使用した理由を疑問に思っている場合:が評価されるまでに、ローカル モジュール変数がクリアされているため、ラスター化された式を関数に直接置き換える必要があるためです。、Module
img
doIt[img]
doIt
このボタンは機能します (多かれ少なかれ)。同じノートブック (例: ) でグラフィックを作成し、Graphics[Circle[]]
それをシングル クリックで選択し、[プレビュー] ボタンをクリックして試してみてください。
ただし、を使用してパレットに配置すると、パレットCreatePalette[button]
のウィンドウ幅に対してラスタライズが行われ、次のような結果が得られます。
ラスタライズの幅を制御するにはどうすればよいですか? または、より一般的には、この問題を回避するアップローダーのプレビュー ダイアログを作成するにはどうすればよいですか?
さらに改善するために、メッセージ ウィンドウのサイズをプレビュー イメージに合わせて調整できると便利です (それでもボタンは表示されます。ボタンは で消えますWindowSize -> All
)。
回答
ウィザード氏の提案:
button = Button[
"Preview", (FrontEndExecute[
FrontEndToken[FrontEnd`SelectedNotebook[], "CopySpecial", "MGF"]];
MessageDialog[
First@Cases[NotebookGet@ClipboardNotebook[],
RasterBox[data_, ___] :>
Image[data, "Byte", ColorSpace -> "RGB", Magnification -> 1],
Infinity]])]
CreatePalette[button]
問題: (おそらく) Windows でのみ動作し、クリップボードの内容を破壊します。