Управление шириной Rasterize [] для выражений, связанных с ноутбуком

Обновить Ответ Mr Wizard дает превосходные по пикселям результаты, но он предназначен только для 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 и уничтожает содержимое буфера обмена.

Ответы на вопрос(4)

Ваш ответ на вопрос