更新向导先生的答案给出了像素完美的结果,但它仅适用于 Windows,并且会破坏剪贴板内容。我的答案应该适用于任何平台,但不太精确:例如它省略了输入/输出标签。它确实允许设置光栅化宽度。
当我尝试为图像上传器制作预览窗口时出现了这个问题(请参阅该答案的结尾)。
我想创建一个调色板按钮,它将当前笔记本选择作为图像上传。在上传之前,我想显示图像的预览,以减少在联系服务器之前出现问题的机会。
这是我到目前为止所拥有的(仅包括预览代码,不包括上传器):
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,并且会破坏剪贴板内容。