4

更新向导先生的答案给出了像素完美的结果,但它仅适用于 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}
        ]
      ]
    ]
  ]
]

如果您想知道为什么我在内部使用嵌套WithModule不是创建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

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 回答