#!pip install -Uqq fastbook
import fastbook
import gradio as gr
fastbook.setup_book()
from fastbook import *
import os
from zipfile import ZipFile
import shutil
import numpy as np
title="批量下载图片"
description="""
1. 可以下载不同种类的图片,图片名称使用空格隔开,比如: 张学友 刘德华 黎明 郭富城\n
2. 下载的数量应该大于0,程序运行的速度与下载的图片数量和种类个数有关\n
"""
article="
"
def zipDir(dirpath,outfullname):
zipp=ZipFile(outfullname,'w')
for path, dirnames,filenames in os.walk(dirpath):
fpath=path.replace(dirpath,'')
for filename in filenames:
zipp.write(os.path.join(path,filename),os.path.join(fpath,filename))
zipp.close()
return outfullname
def download_image(name,number,overwrite):
#dirs=dirs.split(' ')
#dirs=[i for i in dirs if i != '']
#if len(dirs)==0:
# return f"请输入有效的存储地址"
# else:
# dirs=''.join(dirs)
#if not os.path.exists(dirs): # 如果不存在,则创建文件夹。与代码文件所在目录相同。如果存在就直接跳过整段代码
# os.makedirs(dirs) # 创建文件夹
# 因为在使用Huggingface的时候,其不能访问本地电脑,所以直接内置一个地址
dirs='E:\图片'
names=name.split(' ')
names=[i for i in names if i != '']
if len(names)==0:
return f"请输入要下载的图片名称"
number=int(number)
if number<1:
return f"请输入大于0的下载数量"
if overwrite=='允许重复下载':
ow=True
if overwrite=='不允许重复下载':
ow=False
for o in names: # 依次获取想要下载图片的关键字,这里是名字
dest=os.path.join(dirs,o) # 为每个关键字创建一个独立的文件夹
os.makedirs(dest,exist_ok=True) # 创建文件夹
# fastai自带的方法。 {}内是关键字,f'{}',是一种格式化方式
# max_images, 是图片的数量
# 返回图片的链接
# 使用的搜索引擎是 DuckDuckGo,网址是:https://duckduckgo.com/?q=&atb=v319-6__
results=search_images_ddg(f'{o}',max_images=number)
# fastai自带的方法,使用并行的方式下载
# dest 下载目录
# urls 链接
download_images(dest,urls=results,preserve_filename=ow)
# 统计图片信息
files1=os.listdir(dirs)
files2=[]
num1=len(files1)
num2=[]
for i in range(num1):
path2=os.path.join(dirs,files1[i])
files2.append(path2)
num2.append(len(os.listdir(path2)))
printing=[]
for i,j in zip(files1,num2):
pp=f'{i}: 共有{j}张'
printing.append(pp)
prt='\n'.join(printing)
num2=np.array(num2)
out1=f'一共下载{num2.sum()}张图片\n其中:\n{prt}\n'
out2=zipDir(dirs,'pictures.zip')
# 删除文件夹
for i in files2:
shutil.rmtree(i)
return (out1,out2)
demo=gr.Interface(
fn=download_image,
inputs=[
gr.Textbox(
label="要下载的图片名称,比如:刘德华 张学友",
lines=1,
placeholder='刘德华 张学友',
),
gr.Number(value=10, label="下载图片数量,比如:10"),
gr.Radio(['不允许重复下载','允许重复下载'],label='是否允许重复下载'),
# 不用输入下载地址了,也就不需要这个了
#gr.Textbox(
# label="图片存储地址,比如: E:\图片",
# lines=1,
# placeholder='E:\图片',
#value="E:\图片",
# ),
],
# "numpy",
outputs=[gr.Textbox(
label="处理结果",
lines=10,
),
gr.File(
label='图片合集压缩下载'
),
],
title = title,
description = description,
article = article
)
demo.launch(enable_queue=True)