Wolfram mathematica 控制笔记本相关表达式的光栅化[]宽度
更新Mr向导的答案给出了像素级的完美结果,但它仅适用于Windows,会破坏剪贴板内容。我的答案应该适用于任何平台,但不够精确:例如,它省略了输入/输出标签。但它允许设置光栅化宽度Wolfram mathematica 控制笔记本相关表达式的光栅化[]宽度,wolfram-mathematica,mathematica-frontend,Wolfram Mathematica,Mathematica Frontend,更新Mr向导的答案给出了像素级的完美结果,但它仅适用于Windows,会破坏剪贴板内容。我的答案应该适用于任何平台,但不够精确:例如,它省略了输入/输出标签。但它允许设置光栅化宽度 这个问题在我出生时就出现了(见答案的结尾) 我想创建一个调色板按钮,将当前笔记本选择上传为图像。在上传之前,我想显示图像的预览,以减少在联系服务器之前出错的机会 这是我到目前为止所拥有的(只包括预览代码,不包括上传程序): 如果您想知道为什么我在模块中使用嵌套的带,而不是将img也作为模块变量:这是因为在计算doI
这个问题在我出生时就出现了(见答案的结尾) 我想创建一个调色板按钮,将当前笔记本选择上传为图像。在上传之前,我想显示图像的预览,以减少在联系服务器之前出错的机会 这是我到目前为止所拥有的(只包括预览代码,不包括上传程序): 如果您想知道为什么我在
模块
中使用嵌套的带
,而不是将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上工作,并且会破坏剪贴板内容。如果在该操作中使用剪贴板是可行的,您可以使用:
FrontEnd`copysecial[“MGF”]
(以位图形式复制)。您是否尝试过使用ExportString[]将图形创建到内存中?(从技术上讲是临时文件,但您关心什么:)
查看彩色背景上的输出以验证透明背景:
Framed[ImportString[ExportString[x^2,"PNG",Background->None]
,"PNG"]
,Background->Yellow]
对于具有多种颜色变化的图像(如3D打印),我建议使用JPEG2000格式,对于不需要透明度的纯色图像,使用GIF保留颜色细节
是的,您可以在导出图像字符串时控制图像大小
我将所选内容复制到一个新笔记本上,光栅化整个笔记本,然后将其关闭
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像素
请注意,与作为位图复制相比,此方法有一些缺点(在某些情况下有一些优点):
- 自定义样式将丢失
- 输入/输出标签丢失
- 笔记本放大值丢失
如果有需要,可以通过将一些笔记本选项从
选定的笔记本
显式转移到新创建的笔记本来解决这些问题。我认为这应该可以在不需要制作新笔记本的情况下实现:
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
]
我使用了一个小的选项搜索器来查找imageformatingwidth
,通过将图像宽度作为窗口宽度传递,可以使对话框很好地匹配图片,并且仍然显示按钮
以下是其结果的演示:
让我们举一个更完整的例子,因为您的答案不清楚这是如何工作的:
CreatePalette@Button[“复制”,FrontEndExecute[FrontEndToken[FrontEnd`SelectedNotebook[],“CopySpessional”,“MGF”]]]
我的目标是在窗口中预览当前选定的笔记本(然后将其作为图像上载)。如果我理解正确,您建议使用剪贴板将所选内容转移到预览对话框。。。。。。这有两个问题:1。即使我取消对话,它也会破坏剪贴板内容。2.根据文档,“MGF”仅适用于Windows。“否则它会很好地工作。”萨博尔茨我在睡觉前就写了这篇文章,但我什么也没想出来。今天我要再看看整个问题。我也忘了+1这个问题,但我刚刚纠正了。哇,你在哪个时区?虽然这只是Windows操作系统,即使我取消操作也会破坏剪贴板,但对于个人使用来说效果很好。现在我在Mathematica调色板上有了一个单按钮StackOverflow图像上传器:-)我尝试从InputNotebook[]
中提取WindowsSize
,并将其传递到ImageSize
或RasterSize
的选项。但是我找不到神奇的构造(我认为,ImageSize->{{{wmax},{hmax}}
的工作原理与文档中所声称的不一样)。你试过类似的东西吗?@Simon我试过了,但没有成功使用ImageSize
/RasterSize
是一个非常重要的预览,还是让保存本身工作是一个合理的答案?@Mr.Wizard问题的关键是获得预览。要在.@Mr.Wizard之前捕获潜在错误,您找到了将其保存到文件的方法吗?顺便说一句,我个人使用我想我会使用你的解决方案<代码>光栅化[]
并不总能准确地显示我在笔记本中看到的内容(元素被移动)。您是否在调色板上下文中测试过这一点?请用ImportString@ExportString[…,“PNG]
,如我所述,将按钮放在调色板上,您将看到这与普通光栅化
存在相同的问题。
CreatePalette@Button["Preview",
Module[{target},
target =
CreateDocument[{}, WindowSelected -> False, Visible -> False];
NotebookWrite[target, NotebookRead[SelectedNotebook[]]];
CreateDialog[{Rasterize[target], DefaultButton[]}];
NotebookClose[target]
]
]
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
]