欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于django micro搭建網(wǎng)站實(shí)現(xiàn)加水印功能

 更新時(shí)間:2020年05月22日 10:22:06   作者:djl_djl  
這篇文章主要介紹了基于django micro搭建網(wǎng)站實(shí)現(xiàn)加水印功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

用django_micro搭建的,給圖片加文字水印的前端+后端功能開(kāi)發(fā);

大體功能是:輸入水印的文字,選擇要加水印的圖片,最后生成加好水印的圖片。

可在一頁(yè)中顯示多個(gè)加好水印的圖片,且可點(diǎn)擊顯示或隱藏圖片的縮略圖。實(shí)現(xiàn)效果如下:

代碼如下

from django_micro import route, run, configure
from django.http import HttpRequest, HttpResponse
from dominate.document import document
import dominate.tags as dom
from wand.drawing import Drawing   # 加水印用
from wand.image import Image  # 加水印用
import base64  # 圖片轉(zhuǎn)字符串用
 
 
configure({'DEBUG':True})
 
# 一些元素的cls
CENTERFRAME = "flex flex-col items-center justify-center bg-teal-200 h-screen"
UPLOAD_FORM_ATTRIS ={
  "class":"flex flex-col justify-center",
  "ic-post-to": "/file",
  "ic-target": "#result_item",
  "ic-replace-target": "true",
  "enctype": "multipart/form-data"
}
CARD1 = "flex flex-col bg-green-400 shadow-xl p-1 rounded-lg w-80 h-auto"
TEXT_INPUT = "shadow border rounded m-1 p-1 text-base text-center font-thin"
CARD2 = "flex flex-col bg-white shadow-xl p-2 rounded-lg w-80 h-80"
DASHED_BOX = "flex flex-col items-center justify-center border-dashed border-2 border-gray-200 h-full"
UPLOAD_ICON = "fas fa-file-upload text-gray-300 font-medium text-6xl"
UPLOAD_BUTTON = "flex justify-center bg-green-400 px-3 py-2 mt-4 text-white rounded shadow"
RESULT_CONTAINER = "flex flex-col bg-white items-center"
RESULT_ITEM = "flex flex-col justify-center bg-white p-2 border-t border-gray-200 w-64"
TOGGLE_TEXT_ATTRIS = {   # 這個(gè)常量后來(lái)沒(méi)用
  "ic-action":"slideToggle",
  # "ic-target":"#toggle_img", # 以ID定位,只能選擇第一個(gè)元素
  "ic-target":"figure"   # 以元素類(lèi)型定位,會(huì)對(duì)所有同類(lèi)元素進(jìn)行操作
}
 
 
# 為了寫(xiě)head部分的引入方便,寫(xiě)個(gè)link_函數(shù);下面script_函數(shù)類(lèi)似
def link_(lk):
  return dom.link(rel="stylesheet",type="text/css",href=lk)
 
def script_(s):
  return dom.script(src=s)
 
def page():
  doc = document()
  with doc.head:
    link_("https://unpkg.com/tailwindcss@^1.0/dist/tailwind.min.css") # tailwind
    link_("https://extra-uru1z3cxu.now.sh/css/extra.css") # 額外寫(xiě)的擴(kuò)展庫(kù)
    link_("https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.8.2/css/all.css") # 為了使用font-awesome的圖標(biāo)
    script_("https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js") # jquery
    script_("http://intercoolerjs.org/release/intercooler-1.2.2.js")  # intercooler
  with doc.body:
    with dom.div(cls=CENTERFRAME) as CenterFrame:
      with dom.form(UPLOAD_FORM_ATTRIS) as UploadForm:
        # 輸入水印文字區(qū)
        with dom.div(cls=CARD1) as Card1:
          dom.p("Write down your mark here",cls="text-base font-thin text-white" )
          dom.input(cls=TEXT_INPUT,id="wm_text",type="text",name="mark_text",placeholder="your watermark text")
        # 上傳圖片區(qū)
        with dom.div(cls=CARD2) as Card2:
          with dom.div(cls=DASHED_BOX):
            dom.i(cls=UPLOAD_ICON,onclick='''$('#fileupload').click()''')
            dom.p("Find File", id="show_info", cls="text-gray-500 mt-4")
            dom.button("Upload", cls=UPLOAD_BUTTON)
            dom.input(cls="hidden", type="file", id="fileupload",name="ori_img",
                 onchange='''$('#show_info').text(this.value.split("\\\\").pop(-1))''')
 
      # 生成水印圖片區(qū)
      with dom.div(cls=RESULT_CONTAINER) as ResultContainer:
        dom.span(id="result_item")
 
  return doc.render()
 
 
def item(result_file_path):
  filename = result_file_path.split('/',1)[-1].split('.')[0]
  print('filename:',filename)
  # 處理圖片,轉(zhuǎn)成字符串
  with open(result_file_path, "rb") as imageFile:
    img_str = base64.b64encode(imageFile.read())
 
  with dom.div(cls=RESULT_ITEM) as ResultItem:
    with dom.a( {
      "ic-action":"slideToggle",
      "ic-target":f"#{filename}"
    }) as ToggleText:
      dom.p(filename, cls="text-sm font-thin text-center text-gray-800")
    with dom.figure(cls="hidden",id=filename): # id中不能帶'.'(點(diǎn))
      dom.img(title="data src",alt="",
          src = "data:image/jpeg;base64," + str(img_str,'utf-8') ) # 轉(zhuǎn)str時(shí)要加'utf-8',否則不能去掉b'
 
  return dom.span(id="result_item").render() + ResultItem.render()
 
 
@route('')
def index(request: HttpRequest):
  return HttpResponse(page())
 
@route('file')
def filehandler(request:HttpRequest):
  ori_img = request.FILES.get('ori_img')
  mark_text = request.POST.get('mark_text') # 得用request.POST,因?yàn)閒orm提交是用POST方式
  print('mark_text:',mark_text)
  result_file_path = 'output/Toggle_'+ori_img.name  # 打水印后的文件保存路徑
 
  with Image(file=ori_img) as img:
    # 先保存原始圖片
    img.save(filename='userupload/' + ori_img.name)
    # 畫(huà)圖,把字畫(huà)在原圖上
    with Drawing() as ctx:
      ctx.font_family = 'Times New Roman, Nimbus Roman No9'
      # ctx.font_size = 50
      ctx.font_size = int(img.height) * 0.1
      ctx.text_kerning = 20 # 字間距
      ctx.fill_color = 'grey'
      # ctx.opacity = 0.9  # 不透明性
      img.annotate(mark_text, ctx, left=int(img.width) * 0.1, baseline=int(img.height) * 0.45)
    img.save(filename=result_file_path)
 
  return HttpResponse(item(result_file_path))
 
app = run()

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 利用python寫(xiě)api接口實(shí)戰(zhàn)指南

    利用python寫(xiě)api接口實(shí)戰(zhàn)指南

    api接口在我們開(kāi)發(fā)中的重要性相信大家都這篇文章主要給大家介紹了關(guān)于利用python寫(xiě)api接口實(shí)戰(zhàn)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-05-05
  • 簡(jiǎn)單的通用表達(dá)式求10乘階示例

    簡(jiǎn)單的通用表達(dá)式求10乘階示例

    這篇文章主要介紹了簡(jiǎn)單的通用表達(dá)式求10乘階示例,需要的朋友可以參考下
    2014-03-03
  • Pycharm以root權(quán)限運(yùn)行腳本的方法

    Pycharm以root權(quán)限運(yùn)行腳本的方法

    今天小編就為大家分享一篇Pycharm以root權(quán)限運(yùn)行腳本的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-01-01
  • pandas loc與iloc用法及區(qū)別

    pandas loc與iloc用法及區(qū)別

    本文主要介紹了pandas loc與iloc用法及區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • django頁(yè)面跳轉(zhuǎn)問(wèn)題及注意事項(xiàng)

    django頁(yè)面跳轉(zhuǎn)問(wèn)題及注意事項(xiàng)

    這篇文章主要介紹了django頁(yè)面跳轉(zhuǎn)問(wèn)題及注意事項(xiàng),本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-07-07
  • 基于OpenCV的路面質(zhì)量檢測(cè)的實(shí)現(xiàn)

    基于OpenCV的路面質(zhì)量檢測(cè)的實(shí)現(xiàn)

    這篇文章主要介紹了基于OpenCV的路面質(zhì)量檢測(cè),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Python函數(shù)嵌套實(shí)例

    Python函數(shù)嵌套實(shí)例

    這篇文章主要介紹了Python函數(shù)嵌套實(shí)例,本文用實(shí)例講解了Python中的函數(shù)嵌套特性,需要的朋友可以參考下
    2014-09-09
  • 分享6個(gè)隱藏的python功能

    分享6個(gè)隱藏的python功能

    給大家詳細(xì)分析了6個(gè)隱藏的python功能,并詳細(xì)講解了每個(gè)功能用法,需要的朋友學(xué)習(xí)下吧。
    2017-12-12
  • Python對(duì)Tornado請(qǐng)求與響應(yīng)的數(shù)據(jù)處理

    Python對(duì)Tornado請(qǐng)求與響應(yīng)的數(shù)據(jù)處理

    這篇文章主要介紹了Python對(duì)Tornado請(qǐng)求與響應(yīng)的數(shù)據(jù)處理,需要的朋友可以參考下
    2020-02-02
  • 使用matplotlib繪制熱圖(heatmap)全過(guò)程

    使用matplotlib繪制熱圖(heatmap)全過(guò)程

    這篇文章主要介紹了使用matplotlib繪制熱圖(heatmap)全過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12

最新評(píng)論