【问题标题】:how to directly convert wxpython image to pyplot image without saving如何直接将wxpython图像转换为pyplot图像而不保存
【发布时间】:2014-01-28 15:00:30
【问题描述】:

我正在尝试在 pyplot 中显示 wxpython 屏幕截图,但我不想保存图像。 这就是我所拥有的

import wx
from matplotlib import pyplot as plt
import matplotlib.image as mpimg
thisApp = wx.App( redirect=False )  
def saveSnapshot(dcSource): #takes arg dcSource
    # based largely on code posted to wxpython-users by Andrea Gavana 2006-11-08
    size = dcSource.Size
    bmp = wx.EmptyBitmap(size.width, size.height)
    memDC = wx.MemoryDC()
    memDC.SelectObject(bmp)
    memDC.Blit( 0, 0, size.width, size.height, dcSource, 0, 0)
    memDC.SelectObject(wx.NullBitmap)
    img = bmp.ConvertToImage()
    img.SaveFile('saved.png', wx.BITMAP_TYPE_PNG)
    img = mpimg.imread('saved.png')
    plt.imshow(img)
    plt.show()
saveSnapshot(wx.ScreenDC())

这和我想要的差不多,基本上不保存文件只是显示而已。

    img = bmp.ConvertToImage()
    plt.imshow(img)
    plt.show()

【问题讨论】:

    标签: image matplotlib wxpython


    【解决方案1】:

    您可以使用BytesIO 对象。一个可能的解决方案是:

    import wx
    from matplotlib import pyplot as plt
    from io import BytesIO
    thisApp = wx.App(redirect=False)
    
    def saveSnapshot(dcSource):
        size = dcSource.Size
        bmp = wx.EmptyBitmap(size.width, size.height)
        memDC = wx.MemoryDC()
        memDC.SelectObject(bmp)
        memDC.Blit( 0, 0, size.width, size.height, dcSource, 0, 0)
        memDC.SelectObject(wx.NullBitmap)
        img = bmp.ConvertToImage()
        bio = BytesIO()
        bs = wx.OutputStream(bio)
        img.SaveStream(bs, wx.BITMAP_TYPE_PNG)
        bio.seek(0) #rewind stream
        plt.imshow(plt.imread(bio))
        plt.show()
    
    saveSnapshot(wx.ScreenDC())
    

    我为这种方法找到了一些想法here

    更新: 使用 pyscreenshot 的稍微不同的方法可能如下所示:

    import matplotlib.pyplot as plt
    import pyscreenshot as ImageGrab
    
    def saveSnapshot():
        im = ImageGrab.grab()
        plt.imshow(im)
        plt.show()
    

    【讨论】:

    • 感谢它的工作,但它并没有给我节省我正在寻找它的时间。它只快 0.003 秒。该链接有一些很好的信息,我会研究它,也许会找到一种更有效的方法来捕获和显示屏幕截图。我用它来制作屏幕截图视频,效果很好,但我只能获得每秒 8 帧的帧速率。我希望我能把它提高到 15 个。
    • 你可以看看 pyscreenshot (pypi.python.org/pypi/pyscreenshot) 可能会更快。
    • 谢谢你,太完美了。我将 pyscreenshots 计时比我使用的方法快了近 10 倍。你的权利,我应该写一个更好的原始问题,当我尝试了解更多关于图像处理的信息时,两个答案都非常有帮助:)
    • 所以,如果这回答了您的问题,您可能会接受我的回答。 (meta.stackexchange.com/a/5235)
    猜你喜欢
    • 2020-12-01
    • 1970-01-01
    • 2013-11-30
    • 2021-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-20
    • 2020-03-04
    相关资源
    最近更新 更多