Обновление Ответ 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 и уничтожает содержимое буфера обмена.