python 3+的缓冲函数
Buffer function for python 3+
我正在尝试使用 vtk_show 打开 vtk window,但是每次我这样做时我的 Ipython 控制台都会崩溃,显然这是因为 Ipython 可以't 显示外部 window,这正是 vtk_show 所做的。我在 google 上搜索了解决方案,但它是为 python2 编写的(我使用的是 python 3.6.3)。这是我找到的解决方案:
import vtk
from IPython.display import Image
def vtk_show(renderer, width=400, height=300):
"""
Takes vtkRenderer instance and returns an IPython Image with the
rendering.
"""
renderWindow = vtk.vtkRenderWindow()
renderWindow.SetOffScreenRendering(1)
renderWindow.AddRenderer(renderer)
renderWindow.SetSize(width, height)
renderWindow.Render()
windowToImageFilter = vtk.vtkWindowToImageFilter()
windowToImageFilter.SetInput(renderWindow)
windowToImageFilter.Update()
writer = vtk.vtkPNGWriter()
writer.SetWriteToMemory(1)
writer.SetInputConnection(windowToImageFilter.GetOutputPort())
writer.Write()
data = str(buffer(writer.GetResult()))
return Image(data)
我在尝试使用 python2 的 buffer
内置函数时遇到错误,但由于此函数在 python3+ i' 上不存在我卡住了..如果有人能帮我解决这个问题,我将不胜感激。提前致谢!
至少必须在您的代码中修改这两点才能与 Python 3:
具有相同的行为
- Python 2 中的
buffer(...)
内置函数已被 Python 3 中的 memoryview(...)
替换:What is Python buffer type for?。将 buffer
调用替换为 memoryview
str(...)
内置函数必须替换为 bytes(...)
调用以获取 bytes
对象:https://docs.python.org/2/howto/pyporting.html#text-versus-binary-data
所以 data = ...
行应该是:
data = bytes(memoryview(writer.GetResult()))
澄清一下,我认为这个例子是对 informative blog example showing how to extract surfaces from medical images using VTK's marching cubes algorithm. The accompanying Jupyter notebook 的改编,原本是为 Python 2.7 而设计的,并且如前所述,它在 Python 3.6+ 中使用, data=...
部分需要更改。
import vtk
from IPython.display import Image
def vtk_show(renderer, width=400, height=300):
"""
Takes vtkRenderer instance and returns an IPython Image with the
rendering.
"""
renderWindow = vtk.vtkRenderWindow()
renderWindow.SetOffScreenRendering(1)
renderWindow.AddRenderer(renderer)
renderWindow.SetSize(width, height)
renderWindow.Render()
windowToImageFilter = vtk.vtkWindowToImageFilter()
windowToImageFilter.SetInput(renderWindow)
windowToImageFilter.Update()
writer = vtk.vtkPNGWriter()
writer.SetWriteToMemory(1)
writer.SetInputConnection(windowToImageFilter.GetOutputPort())
writer.Write()
data = memoryview(writer.GetResults()).tobytes()
return Image(data)
解决方案肯定归功于@MafiaSkafia 和@jcgiret,但我想 post 一个完整的最终解决方案。
我正在尝试使用 vtk_show 打开 vtk window,但是每次我这样做时我的 Ipython 控制台都会崩溃,显然这是因为 Ipython 可以't 显示外部 window,这正是 vtk_show 所做的。我在 google 上搜索了解决方案,但它是为 python2 编写的(我使用的是 python 3.6.3)。这是我找到的解决方案:
import vtk
from IPython.display import Image
def vtk_show(renderer, width=400, height=300):
"""
Takes vtkRenderer instance and returns an IPython Image with the
rendering.
"""
renderWindow = vtk.vtkRenderWindow()
renderWindow.SetOffScreenRendering(1)
renderWindow.AddRenderer(renderer)
renderWindow.SetSize(width, height)
renderWindow.Render()
windowToImageFilter = vtk.vtkWindowToImageFilter()
windowToImageFilter.SetInput(renderWindow)
windowToImageFilter.Update()
writer = vtk.vtkPNGWriter()
writer.SetWriteToMemory(1)
writer.SetInputConnection(windowToImageFilter.GetOutputPort())
writer.Write()
data = str(buffer(writer.GetResult()))
return Image(data)
我在尝试使用 python2 的 buffer
内置函数时遇到错误,但由于此函数在 python3+ i' 上不存在我卡住了..如果有人能帮我解决这个问题,我将不胜感激。提前致谢!
至少必须在您的代码中修改这两点才能与 Python 3:
具有相同的行为- Python 2 中的
buffer(...)
内置函数已被 Python 3 中的memoryview(...)
替换:What is Python buffer type for?。将buffer
调用替换为memoryview
str(...)
内置函数必须替换为bytes(...)
调用以获取bytes
对象:https://docs.python.org/2/howto/pyporting.html#text-versus-binary-data
所以 data = ...
行应该是:
data = bytes(memoryview(writer.GetResult()))
澄清一下,我认为这个例子是对 informative blog example showing how to extract surfaces from medical images using VTK's marching cubes algorithm. The accompanying Jupyter notebook 的改编,原本是为 Python 2.7 而设计的,并且如前所述,它在 Python 3.6+ 中使用, data=...
部分需要更改。
import vtk
from IPython.display import Image
def vtk_show(renderer, width=400, height=300):
"""
Takes vtkRenderer instance and returns an IPython Image with the
rendering.
"""
renderWindow = vtk.vtkRenderWindow()
renderWindow.SetOffScreenRendering(1)
renderWindow.AddRenderer(renderer)
renderWindow.SetSize(width, height)
renderWindow.Render()
windowToImageFilter = vtk.vtkWindowToImageFilter()
windowToImageFilter.SetInput(renderWindow)
windowToImageFilter.Update()
writer = vtk.vtkPNGWriter()
writer.SetWriteToMemory(1)
writer.SetInputConnection(windowToImageFilter.GetOutputPort())
writer.Write()
data = memoryview(writer.GetResults()).tobytes()
return Image(data)
解决方案肯定归功于@MafiaSkafia 和@jcgiret,但我想 post 一个完整的最终解决方案。