4

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内部でネストされたものを使用した理由を疑問に思っている場合:が評価されるまでに、ローカル モジュール変数がクリアされているため、ラスター化された式を関数に直接置き換える必要があるためです。、ModuleimgdoIt[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 でのみ動作し、クリップボードの内容を破壊します。

4

4 に答える 4

2

この操作でクリップボードを使用することが実用的である場合は、次を使用できます: FrontEnd`CopySpecial["MGF"](ビットマップとしてコピー)。

于 2011-12-02T09:16:53.417 に答える
1

選択範囲を新しいノートブックにコピーし、ノートブック全体をラスタライズしてから閉じることで、これを行うことができました。

CreatePalette@Button["Preview",
  Module[{target},
   target = 
    CreateDocument[{}, WindowSelected -> False, Visible -> False];
   NotebookWrite[target, NotebookRead[SelectedNotebook[]]];
   CreateDialog[{Rasterize[target], DefaultButton[]}];
   NotebookClose[target]
   ]
  ]

このWindowSize -> 500オプションを追加しCreateDocumentて、ラスタライズ幅を 500 ピクセルに設定できます。


ビットマップとしてコピーする場合と比較して、この方法のいくつかの欠点 (場合によっては利点) に注意してください。

  • カスタム スタイルが失われる
  • イン/アウト ラベルが失われる
  • ノートブックの倍率値が失われました

必要に応じて、いくつかのノートブック オプションを からSelectedNotebook新しく作成されたものに明示的に転送することで、これらのいくつかを修正できます。

于 2011-12-30T22:15:00.163 に答える
0

ExportString[] を使用してグラフィックをメモリに作成しようとしましたか? (技術的には一時ファイルに入れますが、どうすればいいですか:] )

ExportString[your_mathematica_stuff_here,"PNG",Background->None]

透明な BG を確認するには、色付きの背景の出力を参照してください。

Framed[ImportString[ExportString[x^2,"PNG",Background->None]
                    ,"PNG"]
       ,Background->Yellow]

色のバリエーションが多い画像 (3D プロットなど) には JPEG2000 形式をお勧めします。透明度が不要な無地の画像には、GIF を使用して色の詳細を保持します。

はい、画像の文字列をエクスポートするときに ImageSize を制御できます。


ExportString の出力と画像の種類/サイズの比較

于 2011-12-05T00:55:35.497 に答える
0

これは、新しいノートブックを作成する必要なく機能するはずです。

button = Button["Preview", 
   Module[{expr = NotebookRead@InputNotebook[]}, 
    If[expr =!= {}, 
     With[{img = 
        Rasterize[expr, 
         ImageFormattingWidth -> 
          First@(WindowSize /. 
             AbsoluteOptions[InputNotebook[], WindowSize])]}, 
      MessageDialog[
       Column[{"Would you like to perform the action?", 
         img}], {"Do it!" :> doIt[img], "Cancel" :> Null},
       WindowSize -> {First@ImageDimensions@img, All}]]]]];
CreateDialog[button,
 WindowFloating -> True,
 WindowClickSelect -> False,
 Selectable -> False
 ]

ちょっとしたオプション サーチャーを使用して検索しImageFormattingWidth、画像の幅をウィンドウの幅として渡すことで、ダイアログを画像にうまく合わせながらボタンを表示することができます。

その結果のデモは次のとおりです。

パレットからのセルのラスタライズ

于 2016-10-26T21:29:41.810 に答える