运行到这里,要是png是颜色索引的必然会cpu单核跑满,一直不停,换成普通png就正常,求教哪里出问题了,弄了半天解决不了
pngquant地址https://pngquant.org/pngquant-windows.zip
[Python] 纯文本查看 复制代码 import os
from pypdf import PdfReader, PdfWriter
from tqdm import tqdm
from PIL import Image
import numpy as np
from sklearn.cluster import KMeans
import subprocess
# 定义一个函数,用于减少图像的颜色数量
def reduce_colors(im, k=4):
# 将图像转换为数组,并重塑为(-1, 3)的形状,表示每个像素的RGB值
image_data = np.array(im).reshape(-1, 3)
# 使用KMeans算法对颜色进行聚类,k为聚类的数量
kmeans = KMeans(n_clusters=k, random_state=0).fit(image_data)
# 获取聚类中心,即新的颜色
centers = kmeans.cluster_centers_
# 将图像数据量化为聚类中心的颜色
quantized_data = centers[kmeans.labels_]
# 将量化后的数据重塑为原始图像的形状
quantized_image = quantized_data.reshape(im.height, im.width, 3)
# 将量化后的数组转换回图像
quantized_image = Image.fromarray(quantized_image.astype('uint8'))
# 保存量化后的图像到临时文件
imgbuffer = 'temp_image.png'
quantized_image.save(imgbuffer, format="PNG", optimize=True)
# 调用外部程序pngquant来进一步压缩图像
path = 'pngquant.exe'
cmd = f'"{path}" -o temp_image.png --force --quality=0-1 --verbose {k} temp_image.png'
try:
subprocess.run(cmd, shell=True, check=True)
except subprocess.CalledProcessError as e:
print(f"Error executing pngquant: {e}")
return None
# 重新打开压缩后的图像
imagexx = Image.open(imgbuffer)
print("这是return前面一行")
return imagexx
# 定义一个函数,用于处理PDF文件中的图像
def process_pdf(pdf_file):
try:
# 读取PDF文件
reader = PdfReader(pdf_file)
# 创建PDF写入器
writer = PdfWriter()
# 遍历PDF的每一页
for page in tqdm(reader.pages, desc=f"Processing {pdf_file}"):
# 将每一页添加到写入器中
writer.add_page(page)
# 再次遍历每一页,处理图像
for page in tqdm(writer.pages, desc=f"Binarizing images {pdf_file}"):
for img in page.images:
# 替换页面中的图像为减少颜色后的图像
img.replace(reduce_colors(img.image))
print("这是reductcolors后面")
# 定义输出文件的名称
output_file = f"reduced_{os.path.splitext(pdf_file)[0]}.pdf"
# 将处理后的PDF写入文件
with open(output_file, "wb") as f:
writer.write(f)
# 输出处理完成的信息
print(f"Processed file saved as {output_file}")
except Exception as e:
# 如果处理过程中出现异常,打印错误信息
print(f"处理文件 {pdf_file} 时发生错误:{e}")
# 定义主函数,用于处理当前目录下的所有PDF文件
def main():
# 获取当前目录下所有PDF文件的列表
pdf_files = [f for f in os.listdir('.') if f.endswith('.pdf')]
# 如果没有找到PDF文件,打印信息并返回
if not pdf_files:
print("当前目录下没有找到PDF文件。")
return
# 遍历PDF文件列表,逐个处理
for pdf_file in pdf_files:
process_pdf(pdf_file)
# 如果这个脚本是作为主程序运行,执行main函数
if __name__ == "__main__":
main() |