Spaces:
Runtime error
Runtime error
import streamlit as st | |
from numpy import load | |
from numpy import expand_dims | |
from matplotlib import pyplot | |
from PIL import Image, ImageDraw, ImageFont, ImageFile | |
import numpy as np | |
import os | |
st.set_page_config(page_title='ASCII字符画生成器', page_icon="🅰", layout="wide") | |
st.header("上传一张图片生成ASCII字符画") | |
ImageFile.LOAD_TRUNCATED_IMAGES = True | |
Image.MAX_IMAGE_PIXELS = None | |
color_fornt = st.sidebar.color_picker('选择前景色', '#00b8e6') | |
color_background = st.sidebar.color_picker('选择背景色', '#ffffff') | |
sc_control = st.sidebar.slider('选择密度参数1', 0.1, 0.9, 0.5, 0.1) | |
gcf_control = st.sidebar.slider('选择密度参数2', 0.5, 4.5, 2.1, 0.1) | |
uploaded_file = st.file_uploader("选择一张图片", type=["png", "jpg", "bmp", "jpeg"]) | |
def asciiart(in_f, SC, GCF, out_f, bgcolor=color_background): | |
chars = np.asarray(list(' .,:irs?@9B&#*$%!~')) | |
font = ImageFont.load_default() | |
letter_width = font.getsize("x")[0] | |
letter_height = font.getsize("x")[1] | |
WCF = letter_height / letter_width | |
img = Image.open(in_f) | |
widthByLetter = round(img.size[0] * SC * WCF) | |
heightByLetter = round(img.size[1] * SC) | |
S = (widthByLetter, heightByLetter) | |
img = img.resize(S) | |
img = np.sum(np.asarray(img), axis=2) | |
img -= img.min() | |
img = (1.0 - img / img.max()) ** GCF * (chars.size - 1) | |
lines = ("\n".join(("".join(r) for r in chars[img.astype(int)]))).split("\n") | |
nbins = len(lines) | |
newImg_width = letter_width * widthByLetter | |
newImg_height = letter_height * heightByLetter | |
newImg = Image.new("RGBA", (newImg_width, newImg_height), bgcolor) | |
draw = ImageDraw.Draw(newImg) | |
leftpadding = 0 | |
y = 0 | |
lineIdx = 0 | |
for line in lines: | |
color = color_fornt | |
lineIdx += 1 | |
draw.text((leftpadding, y), line, color, font=font) | |
y += letter_height | |
newImg.save(out_f) | |
def load_image(filename, size=(512, 512)): | |
pixels = load_img(filename, target_size=size) | |
pixels = img_to_array(pixels) | |
pixels = (pixels - 127.5) / 127.5 | |
pixels = expand_dims(pixels, 0) | |
return pixels | |
def imgGen2(img1): | |
inputf = img1 | |
SC = sc_control | |
GCF = gcf_control | |
asciiart(inputf, SC, GCF, "results.png", color_background) | |
img = Image.open(img1) | |
img2 = Image.open('results.png').resize(img.size) | |
return img2 | |
# 下载按钮效果设置 | |
css = """<style> | |
.stDownloadButton>button { | |
background-color: #0099ff; | |
color:#ffffff; | |
} | |
.stDownloadButton>button:hover { | |
background-color: green; | |
color:white; | |
} | |
</style> | |
""" | |
st.markdown(css, unsafe_allow_html=True) | |
if uploaded_file is not None: | |
st.sidebar.image(uploaded_file, caption='原始图片', use_column_width=True) | |
im = imgGen2(uploaded_file) | |
st.image(im, width=700) | |
with open("results.png", "rb") as file: | |
# st.image("图片.jpg") | |
btn = st.download_button( | |
label="点我下载生成的ASCII字符画", | |
data=file, | |
file_name="ASCII字符画.png", | |
mime="image/png" | |
) | |