web-dev-qa-db-ja.com

python 3+のバッファ関数

Vtk_showを使用してvtkウィンドウを開こうとしていますが、これを行うたびにIpythonコンソールがクラッシュします。これは、Ipythonが外部ウィンドウを表示できないためです。これはvtk_showとまったく同じです。私はグーグルで解決策を検索しましたが、それは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 +に存在しないため、行き詰まります。誰かがこれを手伝ってくれるとしたら、とても感謝している。前もって感謝します!

6
MafiaSkafia

Python 3 :)と同じ動作をするように、少なくともこれら2つのポイントをコードで変更する必要があります。

したがって、data = ...行は次のようになります:

data = bytes(memoryview(writer.GetResult()))
6
jcgiret

明確にするために、この例は非常に VTKのマーチングキューブアルゴリズムを使用して医用画像から表面を抽出する方法を示す有益なブログの例 を適応させたものだと思います。 付属のJupyterノートブック は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にありますが、完全で最終的なソリューションを投稿したいと思いました。

1
amandagb