简化markdown写作中的贴图流程

作者: weishu | 来源:发表于2015-11-12 13:12 被阅读21517次

    markdown写作的时候,图片插入是一件比较麻烦的事情。常见的流程如下:

    1. 用截图工具截图;
    2. 将截图保存到某个地方
    3. 修改截图文件名
    4. 上传截图到某个图床(如果不用“围脖是个好图床”这样的工具,还得用客户端登陆)
    5. 拿到图床上的截图的链接;然后用markdown格式插入图片

    这么复杂的流程,让人简直没有了插入图片的欲望;但是大量的文字没有图片,必然让人疲惫;

    要是能随便截个图,然后直接粘贴就成了markdown格式就好了;自然是能够做到!懒就是生产力~

    效果预览

    首先看看最终达到的效果:
    <img alt="效果预览" src="http://7sbqce.com1.z0.glb.clouddn.com/markdownmarkdownimg.gif" width="660" />

    第一步,截图;第二步,粘贴;done!

    详见github介绍:https://github.com/tiann/markdown-img-upload

    图片上传

    准备工作

    首先要做的是,简化上传图片到图床这个手工的过程,甚至连拖动图片到浏览器插件都省略;这里就自然少不了使用图床的SDK,用代码来帮助我们完成上传操作;

    这里选择七牛的图床,然后新建一个空间,比如我的叫做booluimg,然后点击空间设置里面的域名设置,看看域名是什么,那么以后我的图片就会上传到 这里。

    用SDK上传图片

    使用七牛提供的python SDK,下面的代码可以将一个文件上传到七牛的空间:

    # -*- coding: utf-8 -*-
    
    import os
    from qiniu import Auth, put_file
    
    access_key = '你的Access key' # AK
    secret_key = '你的Secret Key' # SK
    
    bucket_name = 'booluimg' # 七牛空间名
    
    q = Auth(access_key, secret_key)
    
    def upload_qiniu(path):
        ''' upload file to qiniu'''
        dirname, filename = os.path.split(path)
        key = 'markdown/%s' % filename # upload to qiniu's markdown dir
    
        token = q.upload_token(bucket_name, key)
        ret, info = put_file(token, key, path, check_crc=True)
        return ret != None and ret['key'] == key
    

    访问剪切版

    如果我们进行截图或者复制图片,那么图片是存储在系统的剪切版里面的;要将这个图片上传,必需先从剪切版里面弄出来。

    mac

    mac访问剪切版比较简单,如果是文本类型,那么可以直接使用pbcopy, pbpaste这两个命令解决;如果访问其他的多媒体类型,可以使用系统内置的python与objc的访问接口PyObjC;具体关于剪切版的文档可以参考PyObjC文档Objc剪切版文档(不会objc没关系,能看懂)

    如下:

    # -*- coding: utf-8 -*-
    # clipboard.py
    import time
    from AppKit import NSPasteboard, NSPasteboardTypePNG, NSPasteboardTypeTIFF
    
    def get_paste_img_file():
        pb = NSPasteboard.generalPasteboard()
        data_type = pb.types()
        # if img file
        print data_type
        now = int(time.time() * 1000) # used for filename
        if NSPasteboardTypePNG in data_type:
            # png
            data = pb.dataForType_(NSPasteboardTypePNG)
            filename = '%s.png' % now
            filepath = '/tmp/%s' % filename
            ret = data.writeToFile_atomically_(filepath, False)
            if ret:
                return filepath
        elif NSPasteboardTypeTIFF in data_type:
            # tiff
            data = pb.dataForType_(NSPasteboardTypeTIFF)
            filename = '%s.tiff' % now
            filepath = '/tmp/%s' % filename
            ret = data.writeToFile_atomically_(filepath, False)
            if ret:
                return filepath
        elif NSPasteboardTypeString in data_type:
            # string todo, recognise url of png & jpg
            pass
    

    Windows

    windows下,可以装个pywin32然后使用win32api直接访问,具体如何操作自己解决。

    自动化流程

    先阐述一下要达到的理想状态:用截图工具截图(图片默认保存在剪切版),然后在编辑器按下某个类似于粘贴的快捷键,得到一个上传好了到七牛的marddown格式的图片;

    如何达到这个要求呢?上传图片以及到从剪切版获取图片都已经完成,接下来就是这个按键的自动化操作了;在mac上,可以使用Alfred工作流,Windows上,可以使用Autohotkey。

    mac下使用alfred工作流

    使用Alfred新建一个空白的工作流,然后新建一个trigger,快捷键绑定为“ctrl + cmd + v”;然后新建一个run script,选择python;然后填上如下代码:

    query = "{query}"
    from clipboard import get_paste_img_file
    from upload import upload_qiniu
    import os
    
    url = "http://7sbqce.com1.z0.glb.clouddn.com/markdown"
    
    img_file = get_paste_img_file()
    if img_file:
        # has file
        ret = upload_qiniu(img_file)
        if ret:
            # upload success
            name = os.path.split(img_file)[1]
            markdown_url = "![](%s/%s?imageMogr2/thumbnail/!50p/quality/100!)" % (url, name)
            # make it to clipboard
            os.system("echo '%s' | pbcopy" % markdown_url)
            os.system('osascript -e \'tell application "System Events" to keystroke "v" using command down\'')
        else: print "upload_failed"
    else:
        print "get img file failed"
    

    其中,复制到剪切版以及按下cmd + v复制这个功能,使用的系统命令pbcopy, osascript这体现了python作为胶水语言的强大之处!

    这样,这个workflow就完成了,用系统截图工具cmd + option +ctrl + 4截个图,然后在一个编辑器里面按下cmd + ctrl + v看看是什么效果~

    另外有个问题是,mac的retina屏幕截图如果直接使用的话,会是原来的两倍大,我用了七牛的API将图片缩小了一半,但是质量却不太好,不知道有什么办法。

    更新:使用mac自带的sips工具得到图片的尺寸;然后使用img标签替代markdown格式的图片;然后使用css属性控制这个图片的宽度。
    更新2: 使用mac通知中心在上传图片失败的时候给出提醒

    windows下使用autohotkey

    windows下面没有Alfred,但是有强大的AutoHotKey,出发快捷键以及按下ctrl + v完全可以用这个实现;有兴趣的可以自己实现,非常简单。

    相关文章

      网友评论

      • Willis1:我自己也写了一个小工具,支持七牛云,又拍云在内的8种云,支持自动压缩,使用也很方便:右击图片→点击`自定义菜单`上传→到markdown编辑器中粘贴,有兴趣可以了解一下:https://www.xiebruce.top/mac/17.html
      • 来个芒果:感谢,请教一个问题,为什么我按了以后没反应呢?是因为需要把上传图片以及到从剪切版获取图片的脚本放到Alfred工作流脚本文件夹下吗?
      • freecast:如何把图片集成在markdown文件中,就跟pdf一样,可以随便拷贝,不用联网,就可以直接打开,该有的图片就会的?
        weishu:@freecast markdown只是个文本文件,不可能做到。需要这种功能,为何不把markdown导出为pdf格式呢?
        freecast:哦,要是把这个功能完善了,那就更完美了
        weishu:@freecast 这不是md格式的初衷,做不到。
      • HarlanC:我使用greenshot截图工具+七牛云。配置好之后,截图->upload到七牛云,简单快捷。
        http://www.cnblogs.com/harlanc/p/6923500.html
      • BinCode:我没有报错,地址生成了,但图片没有上传上去。
      • ITJason:可以考虑图床神器 iPic:自动上传图片、保存 Markdown 链接,给你前所未有的插图体验。

        - 上传前压缩图片
        - 通过拖拽上传图片
        - 通过服务上传图片 [Command + U]
        - 上传复制的图片 [Shift + Command + U]
        - 支持微博、七牛、又拍、阿里云等图床
        - 自动保存 Markdown 格式链接

        更多介绍:https://toolinbox.net/iPic/
        weishu:@ITJason 期待:heart_eyes:
        ITJason:@weishu 恩,还真被你说对了,继续改进。
        weishu:@ITJason 确实很惊艳!不过貌似木有处理retina截图的问题?
      • 逻辑画疯:不错不错
      • eth10:我直接使用搜狗截图,然后直接粘贴就可以了啊,不用保存到本地都行
      • c46e1ae6ef75:这款工具可以做到截图或者复制图片直接生成markdown格式:MPic:http://mpic.lzhaofu.cn
        ,专门针对windowns用户的图床神器
      • 熊小宇:楼主你好,请问有Win平台的版本吗?
        熊小宇:非常感谢,已经下载在使用。拖拽已经可以上传,QQ截图和复制不知道怎么用,好像点右键不好使啊
        c46e1ae6ef75:@熊小宇 这款工具可以做到截图或者复制图片直接生成markdown格式:MPic:http://mpic.lzhaofu.cn
      • Redvelvet:确实不错
      • Old_yao:果然已经有轮子了,非常感谢!
      • 24隋心所欲:请问博主,「效果预览」的动图是用什么工具做的?
        24隋心所欲:@weishu 多谢~
        weishu:@24隋心所欲 先用CaptureGif录制,然后用软件压缩(录制的是高清的,可是文件太大)
      • 墙壁上的人:没有看懂:sweat:能不能再简单一点,或者能够按图操作?
        weishu:@墙壁上的人 https://github.com/tiann/markdown-img-upload 这里有详细操作方案;本文是实现步骤 :sweat:
      • darcy_bai:我配置好了alfred,然后用快捷键什么事情都没有发生,请问怎么调试? :flushed:
        JackpGao:@weishu 我的当天已经搞定了 目前在用中 非常好用 非常感谢! 对了 gif 是不是没法上传到七牛?
        weishu:@JackpGao 去github https://github.com/tiann/markdown-img-upload 的issues里面看看有木有你们问题的解决办法。
        JackpGao:@darcy_bai 我也遇到了这个情况。
      • 十三弦:赶紧学习下。:smile:
      • 4e7f4a66066f:好方法
      • Tikitoo:博主的文章好赞啊。也欢迎向专题[《Android Dev》](http://www.jianshu.com/collection/6e31b7354a48) 投稿。
        weishu:@Tikitoo 多谢~有好文章了一定投!
      • Kaiyulee:不得不给个赞
      • LostAbaddon:在简书的markdown编辑器中,就是直接粘帖的
        weishu:@塔塔酱 嗯,这个主意也不错!可以一试
        LostAbaddon:@维术 嗯嗯,就是通用化。
        这个也可以用浏览器插件来做。浏览器插件(以Chrome为例)可以截获用户的操作事件,包括粘帖这种,然后自动完成上传到图床和获取图床中图片链接以及替换内容的操作。
        weishu:@塔塔酱 如果用户在别的地方需要插入图片(比如github评论或者写readme的时候)就不行了;简书的编辑器确实考虑到了这个需求,让一般用户无缝体验了这种好处;我这篇文章是在用户由于某些场景用不了自动上传图片生成markdown链接这个功能的时候使用的。

      本文标题:简化markdown写作中的贴图流程

      本文链接:https://www.haomeiwen.com/subject/nwihhttx.html