Python实现截图生成符合markdown的链接

目录
  • 背景
  • 思路
  • 实现

背景

之前是用的是typora来写的文章,最近typora最近开始收费了,所以就不想用了,于是找到了一个替代品MarkText,感觉跟typora差不多

整体样子就像上面,简约风,个人挺喜欢的。唯一的一个问题就是粘贴图片的时候,图片只能放在本地,虽然marktext有图片上传的功能,但是只支持GitHub的图床,设置了过后经常会上传失败,导致还是存在本地,存在本地的弊端就是文章在转移的需要把图片都带上或者复制到掘金等平台的时候,图片会失效。于是打算用python写个自动生成markdownUrl的程序。

思路

程序的整体思路是,首先需要给界面来设置存储的类型,即是选择存在阿里OSS还是七牛的Kodo还是其他的云存储,还有设置key和secret以及不同存储类型所需要的属性,接着界面可以显示复制的图片,以及上传成功后的markdownUrl和httpUrl,界面大体如下

子界面:

主界面:

实现

程序整体选择用python来实现,因为之前用过QT,所以GUI的框架用的是pyqt5,数据库用的是sqlite3,还有阿里云和七牛的sdk等。

整个界面有一个主窗口和一个子窗口构成,主界面在初始化的同时初始化数据库

class ImgFrame(QMainWindow):
    def __init__(self):
        super().__init__()
        self.http_url = None
        self.markdown_url = None
        self.clipboard = None
        self.img = None
        # 初始化数据库
        self.db = init_db()
        self.init_ui()

    def init_ui(self):
        self.setGeometry(300, 300, 500, 500)
        self.setWindowTitle('MarkDown-Img')
        widget = QWidget()
        setupAction = QAction(QIcon('setup.png'), '设置', self)
        setupAction.setStatusTip('Exit application')
        setupAction.triggered.connect(self.a)
        menubar = QMenuBar(self)
        menubar.setGeometry(QtCore.QRect(0, 0, 251, 23))
        menubar.setObjectName("menubar")
        setup = menubar.addMenu('系统')

        setup.addAction(setupAction)
        menubar.setVisible(True)
        menubar.setNativeMenuBar(False)
        self.setMenuBar(menubar)
        self.img = QLabel()
        layout = QVBoxLayout()
        layout.addWidget(markdown_widget(self))
        layout.addWidget(url_widget(self))
        layout.addWidget(self.img)
        layout.setAlignment(Qt.AlignCenter)

        self.clipboard = QApplication.clipboard()
        self.clipboard.dataChanged.connect(self.paste)

        widget.setLayout(layout)
        self.setCentralWidget(widget)
        self.show()
def init_db():
    connect = sqlite3.connect('markdown-img.db')
    global conn
    #全局变量conn
    conn = connect
    cursor = connect.cursor()
    cursor.execute(sql)
    #返回游标
    return cursor

子窗口的主要作用就是设置云存储所需要的各种字段,然后存储到数据库中

class secondFrame(QWidget):
    def __init__(self, db):
        super().__init__()
        # self.init_ui()
        self.db = db
        self.resize(400, 100)
        self.setWindowTitle('存储设置')

        formlayout = QFormLayout()
        storageLabel = QLabel("存储")
        self.storageBox = QComboBox()
        self.storageBox.addItems(['阿里OSS', '七牛Kodo'])

        self.endpointLabel = QLabel("endpoint")
        self.endpointLineEdit = QLineEdit("")
        self.endpointLineEdit.setStyleSheet("width:200px")

        self.qntLabel = QLabel("七牛域名")
        self.qnLineEdit = QLineEdit("")
        self.qnLineEdit.setStyleSheet("width:200px")

        keyLabel = QLabel("access_key")
        self.keyLineEdit = QLineEdit("")
        self.keyLineEdit.setStyleSheet("width:350px")

        secretLabel = QLabel("secret_key")

        self.secretLineEdit = QLineEdit()
        self.secretLineEdit.setStyleSheet("width:350px")
        self.secretLineEdit.setText('')

        bucketLabel = QLabel("bucket_name")
        self.bucketLineEdit = QLineEdit("")

        confirmButton = QPushButton("确定")

        formlayout.addRow(storageLabel, self.storageBox)
        formlayout.addRow(bucketLabel, self.bucketLineEdit)
        formlayout.addRow(self.endpointLabel, self.endpointLineEdit)
        formlayout.addRow(self.qntLabel, self.qnLineEdit)
        self.qntLabel.setVisible(False)
        self.qnLineEdit.setVisible(False)

        formlayout.addRow(keyLabel, self.keyLineEdit)
        formlayout.addRow(secretLabel, self.secretLineEdit)
        formlayout.addRow(confirmButton)

        self.storageBox.currentIndexChanged[int].connect(self.changeLabel)
        confirmButton.clicked.connect(self.confirm)

        self.setLayout(formlayout)
        self.setVisible(True)

子窗口是通过主窗口的菜单栏的设置菜单触发

    setupAction = QAction(QIcon('setup.png'), '设置', self)
    setupAction.setStatusTip('Exit application')
    setupAction.triggered.connect(self.openSecondFrame)
    def openSecondFrame(self):
        self.frame = secondFrame(self.db)
        self.frame.show()

监听剪贴板的功能通过pyqt中的clipboard来监听剪贴板的实现

    self.clipboard.dataChanged.connect(self.paste)
    def paste(self):
        data = self.clipboard.mimeData()
        if data.hasImage():
            print(data.formats())
            pixmap = self.clipboard.pixmap()
            height = pixmap.height()
            width = pixmap.width()
            if height > 300 and width > 300:
                self.img.setPixmap(shrink_img(pixmap))
            else:
                self.img.setPixmap(pixmap)
            fileName = 'ink_' + ''.join(str(uuid.uuid1()).split('-')) + '.png'
            self.clipboard.pixmap().save(fileName, 'PNG')
            urls = generate_url(self.upload(fileName))
            print(urls)
            self.img.setScaledContents(True)
            self.markdown_url.setText(urls['markdown_url'])
            self.http_url.setText(urls['http_url'])
            pyperclip.copy(urls['markdown_url'])
    def shrink_img(pixmap):
        scale = 0.3
        height = pixmap.height()
        width = pixmap.width()
        shrink_height = int(height * scale)
        shrink_width = int(width * scale)
        size = QSize(shrink_width, shrink_height)
        image = pixmap.toImage()
        return QPixmap.fromImage(image.scaled(size, Qt.IgnoreAspectRatio))
  def upload(self, filename):
        type, storage = self.get_storage_data()
        if type == '阿里OSS':
            url = upload2ali(storage, filename)
            return url

    def get_storage_data(self):
        self.db.execute(select_sql)
        data = self.db.fetchone()
        bucket_name = data[1]
        extra = data[2]
        key = data[3]
        secret = data[4]
        if data[0] == '阿里OSS':
            bucket = init_ali(bucket_name, extra, key, secret)
            return '阿里OSS', {'bucket': bucket, 'bucket_name': bucket_name, 'extra': extra}

当图片上传成功后,默认会生成markdown的图片url,然后将这个url设置到剪贴板中,然后在marktext中只需要粘贴就能贴上图床的图片,因为pyqt为了防止死循环,不允许通过剪贴板设置内容,所以我们可以通过pyperclip来设置剪贴板

pyperclip.copy(urls['markdown_url'])

目前只支持阿里oss的,七牛的也是一样,只是上传的sdk会有些不同,看官方文档即可。程序我也在慢慢完善。本文更多的是记录提供个思路

本文的所有图片都是通过这个程序生成链接然后直接到文章中

以上就是Python实现截图生成符合markdown的链接的详细内容,更多关于Python截图生成链接的资料请关注我们其它相关文章!

(0)

相关推荐

  • Python文字截图识别OCR工具实例解析

    一.简介 你一定用过那种"OCR神器",可以把图片中的文字提取出来,极大的提高工作效率. 今天,我们就来做一款实时截图识别的小工具.顾名思义,运行程序时,可以实时把你截出来的图片中的文字识别出来. 二.模块 import keyboard # 用于监控键盘按下,触发事件(pip install keyboard) import time from aip import AipOcr # 调用百度接口(pip install baidu-aip) from PIL import Imag

  • Python实战之实现截图识别文字

    目录 前言 一.获取百度智能云token 二.百度借口调用 三.搭建窗口化的程序以便于使用 四.实现截图的自动保存 五.将识别到的文字输出显示在窗口文本框中并将文字发送到剪切板 六.提取识别后文字中的中(英)文 前言 系统:win10 Python版本:python3.8.6 pycharm版本:pycharm 2021.1.2(Professional Edition) 完整代码下载:Baidu_Ocr.py-Python 一.获取百度智能云token 百度智能云登录后找到人工智能界面下的文字

  • python自动化测试selenium屏幕截图示例

    WebDriver内置了测试中捕获屏幕并保存的方法. 示例脚本: (1)save_screenshot(filename):保存屏幕截图 from selenium import webdriver from time import sleep,strftime,localtime,time import os class TestScreenShot(object): def setup(self): self.driver = webdriver.Chrome() self.driver.g

  • Python生成截图选餐GIF动画

    目录 python生成文字动图 下载表情图片到本地 分析动图 生成单张图片 爬取菜品数据 生成菜名动图 PIL操作gif的其他操作 Gif拆分 GIF倒放 之前群里有小伙伴问今天中午该吃什么,然后另一位小伙伴发了一张下面的动图: 我个人觉得还挺有意思的,截图还真像抽奖一样随机选一个菜名.考虑到这张动图中的菜名候选并不见得都是我们能够吃的菜.我们可以用python根据菜名列表生成这样的动图玩玩. 之前还看到什么截图选头像之类的动图,那类通过图片生成的动图都比较简单,通过文中提到的Imagine的动

  • 用Python实现屏幕截图详解

    目录 一.序言 二.环境配置 三.屏幕截屏源码与解析 四.结语 一.序言 在csdn上有很多纯copy,这给我复现带来了很大的麻烦,所以我想根据我的个人找截图的经历记录下来,给未来的自己看,免得忘记了云云.由于我比较喜欢用opencv处理图像,所以截屏最后都会附带一个使用opencv显示图片的一个步骤. 二.环境配置 1.下载pyautogui包 pip install pyautogui -i https://pypi.tuna.tsinghua.edu.cn/simple/ 注:使用pyau

  • opencv python在视屏上截图功能的实现

    OpenCV简介 OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux.Windows.Android和Mac OS操作系统上.它轻量级而且高效--由一系列 C 函数和少量 C++ 类构成,同时提供了Python.Ruby.MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法. OpenCV用C++语言编写,它的主要接口也是C++语言,但是依然保留了大量的C语言接口.该库也有大量的Python.Java and MATLAB/OCTAVE(版本

  • Python实现截图生成符合markdown的链接

    目录 背景 思路 实现 背景 之前是用的是typora来写的文章,最近typora最近开始收费了,所以就不想用了,于是找到了一个替代品MarkText,感觉跟typora差不多 整体样子就像上面,简约风,个人挺喜欢的.唯一的一个问题就是粘贴图片的时候,图片只能放在本地,虽然marktext有图片上传的功能,但是只支持GitHub的图床,设置了过后经常会上传失败,导致还是存在本地,存在本地的弊端就是文章在转移的需要把图片都带上或者复制到掘金等平台的时候,图片会失效.于是打算用python写个自动生

  • Python Django框架url反向解析实现动态生成对应的url链接示例

    本文实例讲述了Python Django框架url反向解析实现动态生成对应的url链接.分享给大家供大家参考,具体如下: url反向解析:根据url路由规则,动态生成对应的url链接 (防止硬编码). url反向解析应用在两个地方:模板中的超链接,视图中的重定向. 项目名/urls.py(项目的url路由配置,url反向解析,取namespace名字): from django.conf.urls import include, url from django.contrib import ad

  • Python正则抓取新闻标题和链接的方法示例

    本文实例讲述了Python正则抓取新闻标题和链接的方法.分享给大家供大家参考,具体如下: #-*-coding:utf-8-*- import re from urllib import urlretrieve from urllib import urlopen #获取网页信息 doc = urlopen("http://www.itongji.cn/news/").read() #自己找的一个大数据的新闻网站 #抓取新闻标题和链接 def extract_title(info):

  • 用Python代码自动生成文献的IEEE引用格式的实现

    今天尝试着将引用文献的格式按照IEEE的标准重新排版,感觉手动一条一条改太麻烦,而且很容易出错,所以尝试着用Python写了一个小程序用于根据BibTeX引用格式来生成IEEE引用格式. 先看代码,如下: import re def getIeeeJournalFormat(bibInfo): """ 生成期刊文献的IEEE引用格式:{作者}, "{文章标题}," {期刊名称}, vol. {卷数}, no. {编号}, pp. {页码}, {年份}. :

  • 利用Python实现自动生成数据日报

    目录 前言 需求详解 数据处理 前言 人生苦短,快学Python! 日报,是大部分打工人绕不过的难题. 对于管理者来说,日报是事前管理的最好抓手,可以了解团队的氛围和状态.可对于员工来说,那就有的聊了.对于重复性的工作,我非常推荐大家使用Python将其变成模块化.自动化,帮助我们实现高效办公. 下面我们通过一个补写销售日报的案例,展示一下Python自动化办公的优势.本文简化了案例的流程. 需求详解 朋友的需求是这样的,他们平时的销售数据是记录在Excel上,汇总后会按照部门进行统计.但是今年

  • Python实现自动生成请假条

    目录 需求描述 逻辑分析 代码实现 哈喽兄弟们,今天咱们来实现用Python来批量生成请假条,这回既学了东西又做了事情,两不误~ 本文就将基于一个真实的办公案例进行讲解如何提取Excel内容并创建Word 主要将涉及以下三个知识点 openpyxl 读取 Excel 文件 python-docx 写入 Word 文件 python-docx 各类样式的设计和调整 需求描述 你是公司的底层小虾米,前段时间收集了公司各个部门的请假信息汇总表如下: 现在你需要根据表格中每个人的信息依次生成各自的请假条

  • python使用openai生成图像的超详细教程

    OpenAI 是一个人工智能的工具包,包括神经网络.遗传算法和有限状态机等.使用python可以非常便捷的操作OpenAI的API.一下是OpenAI官网列举的功能DEMO 首先使用python的pip进行openai库的安装 pip install openai 在openai官网中找到自己需要测试的api文档 https://platform.openai.com/docs/guides/images/introduction 这里以图像生成示例 在做这一切之前首先得确保你安装了reques

  • python使用pil生成缩略图的方法

    本文实例讲述了python使用pil生成缩略图的方法.分享给大家供大家参考.具体分析如下: 这段代码实现python通过pil生成缩略图的功能,会强行将图片大小修改成250x156 from PIL import Image img = Image.open('jb51.jpg') img = img.resize((250, 156), Image.ANTIALIAS) img.save('jb51_small.jpg') 希望本文所述对大家的Python程序设计有所帮助.

  • 详解python脚本自动生成需要文件实例代码

    python脚本自动生成需要文件 在工作中我们经常需要通过一个文件写出另外一个文件,然而既然是对应关系肯定可以总结规律让计算机帮我们完成,今天我们就通过一个通用文件生成的python脚本来实现这个功能,将大家从每日重复的劳动中解放! 定义一个函数 def produceBnf(infilename,outfilename): List=[] with open(infilename,'r') as inf: for line in inf.readlines(): List.append(re.

  • 通过Python使用saltstack生成服务器资产清单

    SaltStack是一个服务器基础架构集中化管理平台,具备配置管理.远程执行.监控等功能,一般可以理解为简化版的puppet和加强版的func.SaltStack基于Python语言实现,结合轻量级消息队列(ZeroMQ)与Python第三方模块(Pyzmq.PyCrypto.Pyjinjia2.python-msgpack和PyYAML等)构建. 通过部署SaltStack环境,我们可以在成千上万台服务器上做到批量执行命令,根据不同业务特性进行配置集中化管理.分发文件.采集服务器数据.操作系统

随机推荐