贴一篇解决本地MD文档复制到WORDPRESS图片显示出错的脚本

发布于 2023-07-14  361 次阅读


问题分析

  • 本地markdown文档复制到wordpress的md编辑器一直有图片无法正常显示的问题

  • 这份文档在本地是正常的

  • 直整体复制到wordpress编辑器里面也是正常显示

  • 但是一旦发布出去,图片就会变得很小

  • 为什么图片在编辑器里显示正常,发布之后就显示异常呢?如果我们在编辑器里删掉一张图片会给我们答案

  • 此时会发现光标指向了一行文本的开头,原来wordpress的编辑器错误的将图片链接周围的空格删掉了,将图片插入了一句话里面

  • 那么我们回车换行,重新插入图片

  • 重新发布之后图片果然正常了

前置知识

  • 既然知道了原因,解决方法就很简单了,只要把每张图片删掉重新插入一遍就可以了,但是如果一篇报告里面30张图片,那就得机械的重复三十次,会很麻烦.这里采用编写脚本提取图片自动复制链接到剪贴板,wordpress那边还是得自己插入一下🥺实现全自动应该还得写js,看以后有没有佬愿意写吧

  • 脚本需要正则匹配出文档的链接,这个知识点在之前的python爬虫基础二-正则那篇报告里面已经提过了

file=input("请输入同目录下的文件名(不用后缀):\n")
file=file+".md"
text=open(file,"r",encoding='utf-8').read()
pattern=r"]\(http(.*?)\)"
  • 遍历提取到的链接,根据链接将它们显示在一个窗体之中,便于我们来验证一下和原图是不是对的上,如果对的上就点击一个按钮将链接复制到剪贴.
  • 那么首先就需要生成一个窗体,这里使用tkinter生成窗体(之前有报告提过吧?记不清了),直接上模板
from tkinter import *                           #导包

window = Tk()                                   #创建窗体对象
window.title("First Window")                      #设置窗体标题
btn = Button(window,text="Click Me",command=miao) #添加按钮对象
window.mainloop()                               #显示窗体,等待用户交互

  • 其中btn的command参数有个小知识点,如果不传参的话,等号后面直接填目标函数名,而不能加括号,否则不管点不点按钮,函数都将被触发,而点了按钮也不会触发函数

  • 那么不加括号就行了?当函数需要传参的时候是必须要加括号的,而一直使用全局变量传参就会很难受,这里使用lamda匿名函数来传参就正常了
from tkinter import *                               #导包

def miao(i):
    print(i)

window = Tk()                                       #创建窗体对象
window.title("First Window")                      #设置窗体标题
btn = Button(window,text="Click Me",command=lambda: miao("点了没反应?")) #添加按钮对象
btn.pack()                                          #显示按钮
window.mainloop()                                   #显示窗体,等待用户交互

  • 然后需要实现就将指定的内容复制到剪贴板,直接用pyperclip库的函数即可
import pyperclip
content = "这是要复制到剪贴板的内容"
pyperclip.copy(content)
  • 结合tkinter,实现点击按钮就复制
from tkinter import *                               #导包
import pyperclip

def miao(i):
    print(i)

window = Tk()                                       #创建窗体对象
window.title("First Window")                        #设置窗体标题
btn = Button(window,text="Click Me",command=lambda: pyperclip.copy("一会儿用来复制链接"))    #添加按钮对象
btn.pack()                                          #显示按钮
window.mainloop()                                   #显示窗体,等待用户交互

  • 然后就需要将图片展示到tkinter窗体里面了,本来可以用windows自带的图片浏览器打开,再设置一个tkinter窗体保持最前端的,但是windows自带的图片浏览器默认全屏打开改不了,它全屏显示了我怎么才能做到做到一边看本地文档,一边看图片来核对图片?平添一堆操作,不如tkinter显示图片,可以控制图片尺寸和窗体尺寸嘿嘿
  • 读取本地图片显示的方法有很多,pil库,opencv库等等都可以,但是单独使用它们都不支持从网络读取图片,组合其他库即可实现,这里采用request+pil的方式
  • pil的基本用法
from PIL import Image           #导库

image = Image.open(图片位置)        # 打开图像文件,只能打开本地图片
image.show()                    # windows图片浏览器显示图像
  • 先request获取图片二进制数据,转换成pil可读的BytesIO 对象,就能被open了
response = requests.get(url)
image = Image.open(BytesIO(response.content))  
  • 最后,要实现在tkinter里面显示图片,所以就不能使用image.show(),只需要将img转换成tkinter对象,然后用tkinter的label控件显示即可
  • label的image参数是tkinter的图片对象,width和height对应传入对象的宽和高,使用label.pack()显示label,padx,pady是图像与窗口边缘的距离
tk_image = ImageTk.PhotoImage(pil_image_resized)  
label = tk.Label(root, image=tk_image, width=w_box, height=h_box)  
label.pack(padx=5, pady=5)  
  • 最后贴一段别人写的实现将pil图片对象按输入的尺寸等比例的代码,又得按比例缩放,又得按输入的尺寸来,当然是判定按比例缩放后还会超出的那个边来缩放喽.代码很好理解,也很完善,就不用改辣
def resize(w, h, w_box, h_box, pil_image):  

  #对一个pil_image对象进行缩放,让它在一个矩形框内,还能保持比例 
  f1 = 1.0*w_box/w 
  f2 = 1.0*h_box/h  
  factor = min([f1, f2])  

  width = int(w*factor)  
  height = int(h*factor)  
  return pil_image.resize((width, height), Image.ANTIALIAS)  
  • 最后成果大概是这样的
https://drinkflower.asia/wordpress/7/i.php?/upload/2023/07/18/20230718123146-947e95ba-xx.jpg

脚本代码

  • 图片处理的模块是现学的用的别人的,所以也不全是我写的🐶根据自己的情况换换正则就能跑,还可以加点代码做图片爬虫,实现爬取前预览嘿嘿.
  • 有哥们说那个图片数量核对的部分没啥用,辛苦肝了一天的一万六千字的报告,最后插图片因为少了一张,导致插入的图片顺序全乱了,没注意就提交了,这不比动动小手数数图片难受多了😋
from turtle import left, right
import pyperclip
import re
import os
import time  
from PIL import Image, ImageTk  
import tkinter as tk  
import requests
from io import BytesIO

def resize(w, h, w_box, h_box, pil_image):  

  #对一个pil_image对象进行缩放,让它在一个矩形框内,还能保持比例 
  f1 = 1.0*w_box/w 
  f2 = 1.0*h_box/h  
  factor = min([f1, f2])  

  width = int(w*factor)  
  height = int(h*factor)  
  return pil_image.resize((width, height), Image.ANTIALIAS)  

def show(url,times):
    root = tk.Tk()
    root.geometry("800x620")
    btn = tk.Button(root, text="点我复制url", command=lambda: pyperclip.copy(url)) 
    btn.pack()  
    btn1 = tk.Button(root, text="下一张图片", command=lambda: root.destroy()) 
    btn1.pack()  
    root.title="第%d次图片匹配结果,请检查与原文是否相符"%times
    #期望图像显示的大小  
    w_box = 800  
    h_box = 600  
    response = requests.get(url)
    pil_image = Image.open(BytesIO(response.content))  
    #获取图像的原始大小  
    w, h = pil_image.size  
    #缩放图像让它保持比例,同时限制在一个矩形框范围内  
    pil_image_resized = resize(w, h, w_box, h_box, pil_image)  

    tk_image = ImageTk.PhotoImage(pil_image_resized)   
    label = tk.Label(root, image=tk_image, width=w_box, height=h_box)    
    label.pack(padx=5, pady=5)  
    root.mainloop()

file=input("请输入同目录下的文件名(不用后缀):\n")
file=file+".md"

text=open(file,"r",encoding='utf-8').read()
pattern=r"]\(http(.*?)\)"

results=re.findall(pattern,text,re.DOTALL)

if results==None:
    print("匹配失败或无图片,程序退出!")
    time.sleep(10000)
else:
    i=0
    num=input("请输入图片数量以核对,若图片数量不符,程序将终止:\n")
    if(num=="drinkflower"):
        print("进入调试模式")
        i=0
        for result in results:
            i=i+1
            show("http"+result,i)
            os.system("cls")
            print("第%d次匹配的图片为:\n\n"%i,"http"+result+"\n\n")
        os.system("cls")
        print("调试结束")
        time.sleep(10000)
    if(int(num)==len(results)):
        i=0
        for result in results:
            i=i+1
            show("http"+result,i)
            os.system("cls")
            print("第%d次匹配的图片为:\n\n"%i,"http"+result+"\n\n")
        os.system("cls")
        print("处理完成!")
        time.sleep(10000)
    else:
        print("提取图片数量和描述不符,可能存在提取问题,为保证结果可靠,程序终止")
        time.sleep(10000)
届ける言葉を今は育ててる
最后更新于 2024-02-07