Управление шириной Rasterize [] для выражений, связанных с ноутбуком - PullRequest
4 голосов
/ 02 декабря 2011

Обновление Ответ 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], тогда произойдет растеризация для ширины окна палитры, и я получу что-то вроде этого:

Screenshot of the problem

Как я могу контролировать ширину растеризации или, в более общем смысле, как создать диалог предварительного просмотра для загрузчика, который позволяет избежать этой проблемы?

Для дополнительного улучшения было бы неплохо иметь возможность изменить размер окна сообщения таким образом, чтобы оно соответствовало изображению предварительного просмотра (и все еще показывает кнопку: кнопка исчезает с 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 ]

2 голосов
/ 02 декабря 2011

Если в этой операции целесообразно использовать буфер обмена, вы можете использовать: FrontEnd`CopySpecial["MGF"] (копировать как растровое изображение).

1 голос
/ 31 декабря 2011

Мне удалось сделать это, скопировав выделение в новый блокнот, растеризовав весь блокнот, а затем закрыв его.

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 во вновь созданный.

0 голосов
/ 27 октября 2016

Я думаю, что это должно работать без необходимости создавать новую записную книжку:

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 и, передав ширину изображения в качестве ширины окна, вы можете сделатьдиалоговое окно отлично вписывается в изображение и по-прежнему отображает кнопку.

Вот демонстрация его результатов:

Растрирование ячейки из поддона

0 голосов
/ 05 декабря 2011

Вы пытались использовать 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 и сравнение типа / размера изображения http://i44.tinypic.com/ok6fl.png

...