简化markdown写作中的贴图流程(windows基本版)

对之前简陋版的升级修改

接上一篇文章 简化markdown写作中的贴图流程(windows简陋版)

上一篇文章是 做了很久,除了对python不熟,还有懒,所以最终的结果不尽人意,可以说做出来一个半成品。能用,但用起来不爽。 所以,现在完成了基本版,基本版基本可用了

上次的版本是 获取 全屏截图,这样的话像QQ截图这些功能都用不上了,而且还是显示很多不必要的元素在截图里面,比如说下面这个图啊 不必要.jpg 箭头所指的地方,根本不应该出现在截图里面的,是多余的元素。 废话不多说,开干。 思路跟实现跟上次一点区别都没有 代码也只是修改了一个函数,其他的基本没有变化 主要记录遇到的几个问题

代码

先把代码贴出来,再上问题

def save_clipboard_image():
    im = ImageGrab.grabclipboard()
    if im is None:
        print('Error: No image data in clipboard')
        return None

    if isinstance(im, Image.Image):
        print im.format, im.size, im.mode
        width, height = im.size
        saved_path = "img_" + str(time.time()) + ".jpg"
        # im.resize((30, 30), Image.ANTIALIAS).load()
        im.save(saved_path)

        print saved_path
        return saved_path
    else:
        print 'the object in clipboard is not a image.'
        return None

这个函数是修改的,之前是获取全屏截图,现在修改为获取剪贴板中的图片

遇到的问题

问题1
Unsupported BMP bitfields layout

这个是 Pillow 的bug,搜索到解决办法: 作者:青南 链接:https://zhuanlan.zhihu.com/p/21303461 来源:知乎

这个问题从Pillow 2.8.0开始,一直到3.2.0都没有被官方解决。目前有一个间接的解决办法。 请打开Python安装目录下的\Lib\site-packages\PIL\BmpImagePlugin.py文件,将以下代码:

if file_info['bits'] in SUPPORTED:
    if file_info['bits'] == 32 and file_info['rgba_mask'] in SUPPORTED[file_info['bits']]:
        raw_mode = MASK_MODES[(file_info['bits'], file_info['rgba_mask'])]
        self.mode = "RGBA" if raw_mode in ("BGRA",) else self.mode
    elif file_info['bits'] in (24, 16) and file_info['rgb_mask'] in SUPPORTED[file_info['bits']]:
        raw_mode = MASK_MODES[(file_info['bits'], file_info['rgb_mask'])]
    else:
        raise IOError("Unsupported BMP bitfields layout")
else:
    raise IOError("Unsupported BMP bitfields layout")

修改为:

if file_info['bits'] in SUPPORTED:
    if file_info['bits'] == 32 and file_info['rgba_mask'] in SUPPORTED[file_info['bits']]:
        raw_mode = MASK_MODES[(file_info['bits'], file_info['rgba_mask'])]
        self.mode = "RGBA" if raw_mode in ("BGRA",) else self.mode
    elif file_info['bits'] in (24, 16) and file_info['rgb_mask'] in SUPPORTED[file_info['bits']]:
        raw_mode = MASK_MODES[(file_info['bits'], file_info['rgb_mask'])]
    '''新增内容开始'''
    elif file_info['bits'] == 32 and file_info['rgb_mask'] == (0xff0000, 0xff00, 0xff):
        pass
    '''新增内容结束'''
    else:
        raise IOError("Unsupported BMP bitfields layout")
else:
    raise IOError("Unsupported BMP bitfields layout")

就能解决本问题。

问题2
IOError: image file is truncated (1044 bytes not processed)

搜索到解决办法 Python:IOError: image file is truncated 的解决办法

from PIL import ImageFile
ImageFile.LOAD_TRUNCATED_IMAGES = True

问题解决。在 ahk脚本中修改以下 新python文件的路径就可以愉快地玩耍了

^!v::
run,%comspec% /c python D:\python\clipboard_to_qiniu.py

reload 以下 ahk 脚本,使用方法跟之前一模一样,不过现在支持像QQ这类切图软件了。

改进

每次截图之后,就会发现 python文件所在文件夹就会多一张图片,都是已经上传到七牛的了,留下来没有什么用处,还浪费我空间。 那就再加一个逻辑吧:上传到七牛后删除本地的图片

def deleteLocalImage(path):
    if(os.path.isfile(path)):#文件存在
        os.remove(path)

主函数也修改以下

if __name__ == '__main__':
    saved_path = save_clipboard_image()
    if saved_path == None:
        pass
    else:
        q = Qiniu(AK, SK)
        q.upload_file(bucket_name, saved_path, saved_path)
        deleteLocalImage(saved_path)

搞定收工。 这次用起来比较普通了。 普普通通.jpg

 
comments powered by Disqus