用Python提取图片&截图中的文字

《用Python“破解”某度文库等文库复制的限制》

tips:当个标题党真刺激啊
开发背景
临近期末,CYQ要写许多作业。迫不得已寻找度娘解决问题,找到之后,CYQ习惯性地ctrl+c,当ctrl+v时发现,emmm!?没有啊!仔细一看,网页限制了复制。月末生活费告急的CYQ,不得不寻求Python的帮助。于是CYQ快马加鞭完成了。可是!可是!可是!午夜的月光触发了作业截至的丧钟!。。。。


前提准备

  • Python3.7(目测2.7版本也ok)
  • baidu-aip(百度OCR Python SDK)
  • 依赖库 pillow(Python的图像处理标准库)
  • 还有 keyboard(此项可选,监控键盘,设置快捷键,增强用户体验)
  • 一台电脑
  • 百度AI开放平台账号(获取到API调用权限)
    百度AI开放平台API使用移步到(这)*
    也可自行百度

需求分析

  • 能够对图片进行处理
  • 能够显示出处理后的文字结果
  • 能够有较好的用户操作界面(日后优化)

功能实现

  • 本地(磁盘中)图片处理功能(初步)
    直接读取文件,或者按照用户的输入文件路径进行处理。
    使用的函数open()。建议这样写
	with open(img_name,'rb') as File:
	            Img = File.read()

优点是,它会自动关毕文件,不让你的内存变红啊啊啊啊

  • 截图(内存中)图片处理功能(初步)
    将内存中的数据取出并且保存下来
    使用ImageGrab.grabclipboard()来获取图片(因为目前主流的截图都是会放入剪贴板中的,所以可以直接获取到) 这里会返回一个二进制数据。依赖的库是pillow,在一开始我们就导入
 from PIL import ImageGrab

然后我们要用个东西接住二进制数据Image = ImageGrab.grabclipboard()
再然后我们保存它Image.save(img_name)这样我们的问题就从内存中转到磁盘中的解决方法了。这样可以保证图片处理模块复用性高!

  • 真正的图片处理功能(敲黑板)
    我们需要使用百度AI开发平台的Api,稍后会简单介绍一下,或者移步这篇博客百度AI开放平台—简单步骤介绍(多图警告)看具体的操作。
    我们在开头就导入
	 from aip import AipOcr

我们需要写在前面的是,配置信息

	""" 你的 APPID AK SK """
	APP_ID = '这里填你的APP_ID'
	API_KEY = '同理这里是API_KEY'
	SECRET_KEY = '同理这里是SECRET_KEY'
	client = AipOcr(APP_ID, API_KEY, SECRET_KEY)
	"""结束"""

我们通过第一个功能,open() 文件之后,获取到的Img传入到这client里面。用个Result接住
Result = client.basicAccurate(Img)

  • 处理结果显示
    1. 直接在黑框框中显示,简单明了。(个人觉得这样简约,有B格)
    使用函数的话print()不香吗》?
    2. 日后添加自动存入到剪贴板中的功能。(贴合用户使用)
    使用的依赖库pyperclip(剪切板操作)

  • 可视化操作界面
    日后优化,日后优化,日后优化。哈哈哈

  • 截图功能
    (可以借用下已有常用软件的模块,系统截图QQ截图输入法截图) 基本上能够在指定区域截图的软件都OK。如果以后有机会,跟新个截图的实现方法。还得不断学习学习学习

  • 图片保存功能
    上面以及说了,请看 截图(内存中)图片处理功能(初步)这个步骤

  • 图片一键删除功能
    我们可以获取程序当前目录下的所有图片文件,这可难到我了,图片文件辣么多。怎么删?那我们就偷下懒(不写正则),两种方法。
    将全部图片放到一个文件夹里面,直接删除文件夹。os.removedirs(file_name)
    在把内存中图片放到本地时,按照顺序来命名!1.jpg->2.jpg->3.jpg
    这样我们可以简单有效的处理,用个for循环,不断try删除,except就退出。

    try:
        for num in range(1,999):
            i_name = str(num)+r'.jpg'
            os.remove(i_name)
    except:
        print("Done!")

不偷懒写法(写正则)
先用files = [d for d in os.listdir('.')]生成器获取到当前目录下的所有文件。写个正则,匹配一下所有已知图片文件的后缀。筛选后再直接for循环用os.remove(img_name) 进行删除!不贴代码了

  • (功能快捷键设置)
    这是个黑科技!我们先导入
import keyboard

然后再这样

keyboard.add_hotkey('f7',function_1)

OK啦,就这么简单,所以我们可以按f7执行function_1函数啦。真香~


具体代码实现(截图版本):

可以稍微修改下变成,本地版本,直接阉割掉前部分功能,直接读取就ok了。
日后会持续跟新,优化功能,可以关注一下!

from PIL import ImageGrab
from aip import AipOcr
import keyboard,os,time

""" 你的 APPID AK SK """
APP_ID = '这里填你的APP_ID'
API_KEY = '同理这里是API_KEY'
SECRET_KEY = '同理这里是SECRET_KEY'
client = AipOcr(APP_ID, API_KEY, SECRET_KEY)
"""结束"""
global Count
Count = 1
def Solve():
    global Count #这是按顺序命名的全局变量
    try:
        Image = ImageGrab.grabclipboard() #获取截图图片
        Name = str(Count)+r'.jpg' 
        Image.save(Name) #保存图片
        time.sleep(1) #睡觉等待
        Count = Count + 1
        with open(Name,'rb') as File:
            Img = File.read()
        Result = client.basicAccurate(Img)
        Num = Result['words_result_num']
        if (Num==0):
            print("Your Image Has Not Strings") #你的图片里面没有字哦
        else:
            for x in Result['words_result']:
                print(x['words'])
    except:
        print("No Image") #你内存没有图片哦

def Clear():    #try a try 
    global Count
    try:
        for x in range(1,999):#目测正常人应该最多用999个吧
            Name = str(x)+r'.jpg'
            os.remove(Name)
    except:
        print("Done")
    Count = 1 #我香了,别忘记别人还得接住用,把序号再变为1
    
def main():
    keyboard.add_hotkey('f7',Solve) #f7处理图片
    keyboard.add_hotkey('f9',Clear) #f9删除图片
    keyboard.wait('esc') #按退出键结束程序

if __name__ == '__main__':
    main()


软件测试贴图
用Python提取图片&截图中的文字_第1张图片
用Python提取图片&截图中的文字_第2张图片
用Python提取图片&截图中的文字_第3张图片
日后会持续跟新,优化功能,可以关注一下!
本人软工萌新一枚,程序难免会有些缺现,为了不断完善,还望大家能在评论区或者私信相互交流,互相学习。我尽力及时回复的啦!哈哈哈

你可能感兴趣的:(_Python_)