#!pip install -Uqq fastbook
import fastbook
import gradio as gr
fastbook.setup_book()
from fastbook import *
import os
title="批量下载图片"
description="""
1. 可以下载不同种类的图片,图片名称使用空格隔开,比如: 张学友 刘德华 黎明 郭富城\n
2. 下载的数量应该大于0,程序运行的速度与下载的图片数量和种类个数有关\n
3. 图片存储地址不能包含空格,有效的存储地址:E:/图片
"""
article="
"
def download_image(name,number,overwrite,dirs):
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) # 创建文件夹
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)
num1=len(files1)
num2=[]
for i in range(num1):
path2=os.path.join(dirs,files1[i])
num2.append(len(os.listdir(path2)))
# return dirs
# return f'已下载的文件有:{files1},其中各下载了{num2}'
return f'图片存放地址{dirs}\n 已下载的文件有{[{i:j} for i,j in zip(files1,num2)]}'
demo=gr.Interface(
fn=download_image,
inputs=[
gr.Textbox(
# placeholder='刘德华',
# value='刘德华',
label="要下载的图片名称,比如:刘德华 张学友",
lines=1,
),
gr.Number(value=10, label="下载图片数量,比如:10"),
gr.Radio(['不允许重复下载','允许重复下载'],label='是否允许重复下载'),
gr.Textbox(
label="图片存储地址,比如: E:/图片",
lines=1,
# placeholder='E:\Research\ldh',
# value="E:\Research\ldh",
),
],
# "numpy",
outputs=[gr.Textbox(
label="处理结果",
lines=10,
)],
# allow_flagging = "manual",
# examples=[
# [30,5.98,1, "HighScore", [["Zr", 1, 91, 135.6], ["O", 2, 16, 11.63]]],
# [1,3.97,1, "临界角全反射模型", [["Al",2, 27,50.33], ["O",3, 16, 11.63]]],
# ],
title = title,
description = description,
article = article
)
demo.launch()