1、发现问题
背景是我们开发了一个app(h5开发),只能内网访问,而且禁了手机截屏。现在需要截图发给美工,让她提一些修改意见。
于是通过内网电脑打开页面,用chrome开启app预览模式。
使用qq截图,可以截,但是很难准确的切到页面的边上,如下图。
2、解决问题
于是考虑自己动手搞一个截图,截固定区域即可。
引入pil库,分分钟就搞定了截图
import time
from PIL import ImageGrab, Image
folderpath="D:/小姐姐截图/"
# 区域截图left, upper, right, lower
def screenRegion():
try:
left, top = 66, 54
width, height = 375, 667 # iphone6
bbox = (left, top, left + width, top + height)
img = ImageGrab.grab(bbox)
newfilename = "{}{}.jpg".format(folderpath,int(time.time() * 1000))
img.save(newfilename)
print("screen saved!")
except Exception as e:
print("error:",e)
这样我只需要把pycharm放在旁边,执行一下,就可以截图了。
3、优化解决方案
然而这样还是需要在chrome和pycharm之间切来切去,非常不舒适。
那么就搞一个键盘监听,按键一下截一张。
import time
from PIL import ImageGrab, Image
from pynput import keyboard, mouse
folderpath="D:/小姐姐截图/"
#按键松开的时候执行,这里用的是PrintScreen这个键,你也可以用其他的
def on_release(key):
if key == keyboard.Key.print_screen:
screenRegion()
# 区域截图left, upper, right, lower
def screenRegion():
try:
left, top = 66, 54
width, height = 375, 667 # iphone6
bbox = (left, top, left + width, top + height)
img = ImageGrab.grab(bbox)
newfilename = "{}{}.jpg".format(folderpath,int(time.time() * 1000))
img.save(newfilename)
print("screen saved!")
except Exception as e:
print("error:",e)
if __name__ == '__main__':
listener = keyboard.Listener(on_release=on_release)
listener.start()
listener.join()
这样按一下PrintScreen,就会截图并且自动生成文件,大功告成。
4、成果
随手截上几张,啪啪啪,emmm,每次都精确的切到固定的点位,极度舒适。
5、复制到剪切板——用了几天后回来补充这一章
细心的小伙伴可能发现了,保存文件虽然可以了,但是当我按下PrintScreen的时候,复制到剪切板的仍然是全屏,这样以来我如果想直接ctrl+v到qq或者微信发给别人就不是很方便了,还要找到那个文件再发。
于是我又加了把那个区域截图放到剪切板的代码。
# 往剪贴板中放入图片
def setClipboard(data):
win32clipboard.OpenClipboard() # 打开剪贴板
win32clipboard.EmptyClipboard() # 先清空剪贴板
win32clipboard.SetClipboardData(win32con.CF_DIB, data) # 将图片放入剪贴板
win32clipboard.CloseClipboard()
代码的最终形态如下:
import time,io
from PIL import ImageGrab, Image
import win32clipboard,win32con
from pynput import keyboard, mouse
folderpath="D:/小姐姐截图/"
def on_release(key):
if key == keyboard.Key.print_screen:
screenRegion()
# 区域截图left, upper, right, lower
def screenRegion():
try:
left, top = 34, 54
width, height = 375, 667 # iphone6
bbox = (left, top, left + width, top + height)
img = ImageGrab.grab(bbox)
newfilename = "{}{}.jpg".format(folderpath,int(time.time() * 1000))
img.save(newfilename)
# 将图片转换为字节流
output = io.BytesIO()
img.convert("RGB").save(output, "BMP")
data = output.getvalue()[14:]
setClipboard(data)
print("screen saved!")
except Exception as e:
print("error:",e)
# 往剪贴板中放入图片
def setClipboard(data):
win32clipboard.OpenClipboard() # 打开剪贴板
win32clipboard.EmptyClipboard() # 先清空剪贴板
win32clipboard.SetClipboardData(win32con.CF_DIB, data) # 将图片放入剪贴板
win32clipboard.CloseClipboard()
if __name__ == '__main__':
listener = keyboard.Listener(on_release=on_release)
listener.start()
listener.join()