Wolfram mathematica 控制笔记本相关表达式的光栅化[]宽度

Wolfram mathematica 控制笔记本相关表达式的光栅化[]宽度,wolfram-mathematica,mathematica-frontend,Wolfram Mathematica,Mathematica Frontend,更新Mr向导的答案给出了像素级的完美结果,但它仅适用于Windows,会破坏剪贴板内容。我的答案应该适用于任何平台,但不够精确:例如,它省略了输入/输出标签。但它允许设置光栅化宽度 这个问题在我出生时就出现了(见答案的结尾) 我想创建一个调色板按钮,将当前笔记本选择上传为图像。在上传之前,我想显示图像的预览,以减少在联系服务器之前出错的机会 这是我到目前为止所拥有的(只包括预览代码,不包括上传程序): 如果您想知道为什么我在模块中使用嵌套的带,而不是将img也作为模块变量:这是因为在计算doI

更新Mr向导的答案给出了像素级的完美结果,但它仅适用于Windows,会破坏剪贴板内容。我的答案应该适用于任何平台,但不够精确:例如,它省略了输入/输出标签。但它允许设置光栅化宽度


这个问题在我出生时就出现了(见答案的结尾)

我想创建一个调色板按钮,将当前笔记本选择上传为图像。在上传之前,我想显示图像的预览,以减少在联系服务器之前出错的机会

这是我到目前为止所拥有的(只包括预览代码,不包括上传程序):

如果您想知道为什么我在
模块
中使用嵌套的
,而不是将
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
 ]