Spaces:
Sleeping
Sleeping
import streamlit as st | |
from diffusers import StableDiffusionPipeline | |
import torch | |
from PIL import Image, ImageFilter, ImageEnhance | |
import time | |
import io | |
def generate_image(text, style): | |
try: | |
torch.backends.cudnn.benchmark = True | |
# Adjust this part based on how styles are selected in your 'diffusers' library | |
if style.startswith('custom:'): | |
# Handle custom style input | |
text = text + "," + style | |
else: | |
text = text + "," + style | |
pipe = StableDiffusionPipeline.from_pretrained("IDEA-CCNL/Taiyi-Stable-Diffusion-1B-Chinese-v0.1", | |
torch_dtype=torch.float16) | |
pipe.to('cuda') | |
# Simulate a delay to show the loading spinner | |
time.sleep(3) | |
image = pipe(text, guidance_scale=7.5, num_inference_steps=20).images[0] | |
return image | |
except Exception as e: | |
st.error(f"发生错误: {str(e)}") | |
return None | |
def apply_image_filters(image, filter_type, filter_strength): | |
if filter_type == '模糊': | |
return image.filter(ImageFilter.BLUR) | |
elif filter_type == '锐化': | |
enhancer = ImageEnhance.Sharpness(image) | |
return enhancer.enhance(filter_strength) | |
elif filter_type == '亮度': | |
enhancer = ImageEnhance.Brightness(image) | |
return enhancer.enhance(filter_strength) | |
elif filter_type == '对比度': | |
enhancer = ImageEnhance.Contrast(image) | |
return enhancer.enhance(filter_strength) | |
else: | |
return image | |
# Dictionary of predefined ancient poems with names and full content | |
ancient_poems = { | |
"庐山谣": "百川东到海,何时复西归?少壮不努力,老大徒伤悲。", | |
"将进酒": "君不见黄河之水天上来,奔流到海不复回。\n君不见高堂明镜悲白发,朝如青丝暮成雪。", | |
"静夜思": "床前明月光,疑是地上霜。\n举头望明月,低头思故乡。", | |
# Add more poems as needed | |
} | |
def main(): | |
# Set page title and favicon | |
st.set_page_config( | |
page_title="古诗成图", | |
page_icon=":art:", | |
layout="wide" | |
) | |
# Header and instructions | |
st.title("古诗成图") | |
st.write("欢迎使用古诗成图应用!输入一句古诗,选择图片风格,然后点击“生成图片”按钮。") | |
# Input for Poetry Text | |
text = st.text_input("请输入一句古诗:", help="在这里输入您想要转化为图片的古诗.") | |
# Input for Image Style | |
style_options = ['古风', '插画', '油画', '自然', '现代', 'custom:自定义风格'] | |
style = st.selectbox("选择图片风格:", style_options, help="选择生成图片的风格.") | |
# Additional Customization Options | |
st.sidebar.header("图像定制选项") | |
filter_type = st.sidebar.selectbox("应用滤镜:", ['无', '模糊', '锐化', '亮度', '对比度']) | |
filter_strength = st.sidebar.slider("滤镜强度:", 0.1, 2.0, 1.0) | |
# Display predefined ancient poems in the sidebar | |
selected_poem_name = st.sidebar.selectbox("选择古诗:", list(ancient_poems.keys()), help="选择一个古诗,将其插入到输入框中.") | |
# Button to expand and collapse the full content of the selected poem | |
if st.sidebar.button("展开/收起古诗内容"): | |
if selected_poem_name in ancient_poems: | |
st.sidebar.write(f"**{selected_poem_name}**:\n{ancient_poems[selected_poem_name]}") | |
# Button to insert the selected poem into the text input | |
if st.sidebar.button("插入古诗"): | |
text = ancient_poems[selected_poem_name] | |
# Create an empty placeholder for the generated image | |
image_placeholder = st.empty() | |
# Button to Generate Image | |
generate_button = st.button("生成图片", help="点击此按钮生成基于古诗的艺术图片.") | |
# Use st.spinner to display a loading spinner | |
with st.spinner("正在生成图片,请稍候..."): | |
if generate_button: | |
generated_image = generate_image(text, style.lower()) | |
if generated_image is not None: | |
# Apply Customization Options | |
customized_image = apply_image_filters(generated_image, filter_type, filter_strength) | |
# # Display the generated text | |
# st.subheader("生成的古诗文本:") | |
# st.text(text) | |
# Display the generated image | |
image_placeholder.image(customized_image, caption=f"生成的图片", use_column_width=True) | |
# Shareable link | |
shareable_link = st.text_input("生成的图片链接:", value="复制此链接并分享", key="shareable_link") | |
# Download Button for Image | |
if st.button("下载生成的图片"): | |
# Convert the image to bytes | |
img_bytes = io.BytesIO() | |
customized_image.save(img_bytes, format='PNG') | |
# Additional logging for debugging | |
print(f"Attempting to download image. Bytes length: {len(img_bytes.getvalue())}") | |
st.download_button( | |
label="下载生成的图片", | |
data=img_bytes.getvalue(), | |
file_name=f"generated_image_{style.lower()}.png", | |
key=f"download_button_{style.lower()}" | |
) | |
if __name__ == "__main__": | |
main() |