Taking Screen shots of specific size

后端 未结 5 442
庸人自扰
庸人自扰 2021-01-03 03:26

What imaging modules for python will allow you to take a specific size screenshot (not whole screen)? I have tried PIL, but can\'t seem to make ImageGrab.grab() select a sma

相关标签:
5条回答
  • 2021-01-03 04:13

    You can use pyscreenshot module.
    The pyscreenshot module can be used to copy the contents of the screen to a PIL image memory or file. You can install it using pip.

    $ sudo pip install pyscreenshot
    

    Usage:

    import pyscreenshot as ImageGrab
    # fullscreen
    im=ImageGrab.grab()
    im.show()
    
    # part of the screen
    im=ImageGrab.grab(bbox=(10,10,500,500))
    im.show()
    
    # to file
    ImageGrab.grab_to_file('im.png')
    
    0 讨论(0)
  • 2021-01-03 04:20

    I have tried PIL, but can't seem to make ImageGrab.grab() select a small rectangle

    What did you try?

    As the documentation for ImageGrab clearly states, the function has a bbox parameter, and:

    The pixels inside the bounding box are returned as an “RGB” image. If the bounding box is omitted, the entire screen is copied.

    So, you only get the whole screen if you don't pass a bbox.

    Note that, although I linked to the Pillow docs (and you should be using Pillow), old-school PIL's docs say the same thing:

    The bounding box argument can be used to copy only a part of the screen.

    So, unless you're using a really, really old version of PIL (before 1.1.3, which I believe is more than a decade out of date), it has this feature.

    0 讨论(0)
  • 2021-01-03 04:20

    You can use pyscreenshot at linux or windows platforms . I am using Ubuntu it works for me. You can force if subprocess is applied setting it to false together with mss gives the best performance.

    import pyscreenshot as ImageGrab
    import time
    t1 = time.time()
    imgScreen = ImageGrab.grab(backend="mss", childprocess=False)
    img = imgScreen.resize((640,480))
    img.save("screen.png")
    t2 = time.time()
    print("The passing time",(t2-t1))
    
    
    0 讨论(0)
  • 2021-01-03 04:24

    You could use Python MSS.

    From documentation to capture only a part of the screen:

    import mss
    import mss.tools
    
    
    with mss.mss() as sct:
        # The screen part to capture
        monitor = {"top": 160, "left": 160, "width": 160, "height": 135}
        output = "sct-{top}x{left}_{width}x{height}.png".format(**monitor)
    
        # Grab the data
        sct_img = sct.grab(monitor)
    
        # Save to the picture file
        mss.tools.to_png(sct_img.rgb, sct_img.size, output=output)
        print(output)
    
    0 讨论(0)
  • 2021-01-03 04:27

    1) Use pyscreenshot, ImageGrab works but only on Windows

    2) Grab the image and box it, then save that image

    3) Don't use ImageGrab.grab_to_file, it saves the full size image

    4) You don't need to show the image with im.show if you just want to save a screenshot

    import pyscreenshot as ImageGrab
    
    im=ImageGrab.grab(bbox=(10,10,500,500))
    
    im.save('im.png')
    
    0 讨论(0)
提交回复
热议问题