vue3中使用 tui-image-editor進行圖片處理,并上傳

效果圖

在這里插入圖片描述

下載包

pnpm i tui-image-editor
pnpm i tui-color-picker

調用組件

//html部分
<el-dialog v-model="imgshow" destroy-on-close width="40%" draggable align-center :show-close="true":close-on-click-modal="false"><template #header><div style="display: flex; justify-content: space-between"><div style="display: flex"><h3>圖片</h3></div></div></template><div class="newBox"><!-- 圖片處理框 --><SignImage v-if="cropperObj.cVisible" :dialogVisible="cropperObj.cVisible" :title="cropperObj.ctitle":imgUrl="cropperObj.previewsImgUrl" @getNewImg="cropperObj.getNewImg"@closeCropperDialog="cropperObj.closeCropperView"></SignImage></div></el-dialog>//js部分
import { SignImage } from './index';//調用組件
let imgshow = ref<boolean>(false);
const cropperObj = reactive({cVisible: true, // 顯示切圖彈框ctitle: "", // 彈框標題previewsImgUrl: "https://img0.baidu.com/it/u=2759734465,3558448225&fm=253&app=138&size=w931&n=0&f=JPEG&fmt=auto?sec=1708621200&t=acc59373dca9b8658e33e14a974f6c47", //圖片地址// 開啟剪切彈框openCropperView: () => {cropperObj.ctitle = "圖片處理"cropperObj.cVisible = true},// 關閉彈框所觸發的事件closeCropperView: (data) => {cropperObj.cVisible = false},// 獲取處理完的圖片數據getNewImg: (val: any) => {console.log("val", val);pictureAnnotationFun(val)}
})
//圖片上傳函數,并加其他參數
async function pictureAnnotationFun(file: any) {const formData = new FormData()formData.append("file", file);formData.append('id', xx);formData.append('bid', xxx);try {const { code, msg, data } = await uploadimg(formData);if (code > 0) {cropperObj.cVisible = false;ElMessage({showClose: true,message: '上傳成功',type: 'success',});} else {ElMessage({showClose: true,message: '上傳失敗' + msg,type: 'error',duration: 0,});}} catch (e) {ElMessage({showClose: true,message: '錯誤: ' + e.message,type: 'error',duration: 0,});}
}

封裝組件代碼

<template><div class="drawing-container"><!-- 繪圖組件容器DOM --><div id="tui-image-editor"></div><el-button class="save" type="primary" @click="save">保存</el-button></div>
</template>
<script setup lang="ts">
import 'tui-image-editor/dist/tui-image-editor.css';
import 'tui-color-picker/dist/tui-color-picker.css';
import ImageEditor from 'tui-image-editor';
import { nextTick, onMounted, ref } from 'vue';// 中文菜單
const locale_zh = {ZoomIn: '放大',ZoomOut: '縮小',Hand: '手掌',History: '歷史',Resize: '調整寬高',Crop: '裁剪',DeleteAll: '全部刪除',Delete: '刪除',Undo: '撤銷',Redo: '反撤銷',Reset: '重置',Flip: '鏡像',Rotate: '旋轉',Draw: '畫',Shape: '形狀標注',Icon: '圖標標注',Text: '文字標注',Mask: '遮罩',Filter: '濾鏡',Bold: '加粗',Italic: '斜體',Underline: '下劃線',Left: '左對齊',Center: '居中',Right: '右對齊',Color: '顏色','Text size': '字體大小',Custom: '自定義',Square: '正方形',Apply: '應用',Cancel: '取消','Flip X': 'X 軸','Flip Y': 'Y 軸',Range: '區間',Stroke: '描邊',Fill: '填充',Circle: '圓',Triangle: '三角',Rectangle: '矩形',Free: '曲線',Straight: '直線',Arrow: '箭頭','Arrow-2': '箭頭2','Arrow-3': '箭頭3','Star-1': '星星1','Star-2': '星星2',Polygon: '多邊形',Location: '定位',Heart: '心形',Bubble: '氣泡','Custom icon': '自定義圖標','Load Mask Image': '加載蒙層圖片',Grayscale: '灰度',Blur: '模糊',Sharpen: '銳化',Emboss: '浮雕','Remove White': '除去白色',Distance: '距離',Brightness: '亮度',Noise: '噪音','Color Filter': '彩色濾鏡',Sepia: '棕色',Sepia2: '棕色2',Invert: '負片',Pixelate: '像素化',Threshold: '閾值',Tint: '色調',Multiply: '正片疊底',Blend: '混合色',Width: '寬度',Height: '高度','Lock Aspect Ratio': '鎖定寬高比例',
};// 畫布組件自定義樣式
const customTheme = {'common.bi.image': '', // 左上角logo圖片'common.bisize.width': '0px','common.bisize.height': '0px','common.backgroundImage': 'none','common.backgroundColor': '#f3f4f6','common.border': '1px solid #333',// header'header.backgroundImage': 'none','header.backgroundColor': '#f3f4f6','header.border': '0px',// load button'loadButton.backgroundColor': '#fff','loadButton.border': '1px solid #ddd','loadButton.color': '#222','loadButton.fontFamily': 'NotoSans, sans-serif','loadButton.fontSize': '12px','loadButton.display': 'none', // 可以直接隱藏掉// download button'downloadButton.backgroundColor': '#fdba3b','downloadButton.border': '1px solid #fdba3b','downloadButton.color': '#fff','downloadButton.fontFamily': 'NotoSans, sans-serif','downloadButton.fontSize': '12px','downloadButton.display': 'none', // 可以直接隱藏掉// icons default'menu.normalIcon.color': '#8a8a8a','menu.activeIcon.color': '#555555','menu.disabledIcon.color': '#ccc','menu.hoverIcon.color': '#e9e9e9','submenu.normalIcon.color': '#8a8a8a','submenu.activeIcon.color': '#e9e9e9','menu.iconSize.width': '24px','menu.iconSize.height': '24px','submenu.iconSize.width': '32px','submenu.iconSize.height': '32px',// submenu primary color'submenu.backgroundColor': '#1e1e1e','submenu.partition.color': '#858585',// submenu labels'submenu.normalLabel.color': '#858585','submenu.normalLabel.fontWeight': 'lighter','submenu.activeLabel.color': '#fff','submenu.activeLabel.fontWeight': 'lighter',// checkbox style'checkbox.border': '1px solid #ccc','checkbox.backgroundColor': '#fff',// rango style'range.pointer.color': '#fff','range.bar.color': '#666','range.subbar.color': '#d1d1d1','range.disabledPointer.color': '#414141','range.disabledBar.color': '#282828','range.disabledSubbar.color': '#414141','range.value.color': '#fff','range.value.fontWeight': 'lighter','range.value.fontSize': '11px','range.value.border': '1px solid #353535','range.value.backgroundColor': '#151515','range.title.color': '#fff','range.title.fontWeight': 'lighter',// colorpicker style'colorpicker.button.border': '1px solid #1e1e1e','colorpicker.title.color': '#fff',
};// props
const props = defineProps({dialogVisible: {type: Boolean,default: () => {return false;},},title: {type: String,default: '',},imgUrl: {type: String,default: '',},
});
const emit = defineEmits(['closeCropperDialog', 'getNewImg']);
const instance = ref<any>(null);onMounted(() => {nextTick(() => {init(); // 頁面創建完成后調用});
});// 關閉彈框
const closeDialog = () => {emit('closeCropperDialog');// options.img = ''
};const init = () => {instance.value = new ImageEditor(document.querySelector('#tui-image-editor'), {includeUI: {loadImage: {path: props.imgUrl,name: 'image',},menu: ['resize', 'crop', 'rotate', 'draw', 'shape', 'icon', 'text', 'filter'], // 底部菜單按鈕列表 隱藏鏡像flip和遮罩maskinitMenu: 'draw', // 默認打開的菜單項menuBarPosition: 'bottom', // 菜單所在的位置locale: locale_zh, // 本地化語言為中文theme: customTheme, // 自定義樣式},cssMaxWidth: 400, // canvas 最大寬度cssMaxHeight: 500, // canvas 最大高度});document.getElementsByClassName('tui-image-editor-main')[0].style.top = '45px'; // 調整圖片顯示位置document.getElementsByClassName('tie-btn-reset tui-image-editor-item help')[0].style.display = 'none'; // 隱藏頂部重置按鈕
};// 保存圖片,并上傳
const save = async () => {const base64String = instance.value.toDataURL(); // base64 文件const data = window.atob(base64String.split(',')[1]);const ia = new Uint8Array(data.length);for (let i = 0; i < data.length; i++) {ia[i] = data.charCodeAt(i);}const file = new File([ia], "打標.png", { type: "image/png" });emit('getNewImg', file);};
</script><style lang="scss" scoped>
.drawing-container {width: 100%;height: 80vh;position: relative;.save {position: absolute;right: 50px;top: 15px;}
}
</style>

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/696372.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/696372.shtml
英文地址,請注明出處:http://en.pswp.cn/news/696372.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mescroll 在uni-app 運行的下拉刷新和上拉加載的組件

官網傳送門: https://www.mescroll.com/uni.html 最近使用到了mescroll 但是一直都是整個頁面的滾動, 最近需求有需要局部滾動, 收藏了一個博主的文章覺得寫的還挺好, 傳送門: https://blog.csdn.net/Minions_Fatman/article/details/134754926?spm1001.2014.3001.5506 使用…

基于springboot+vue的視頻網站系統(前后端分離)

博主主頁&#xff1a;貓頭鷹源碼 博主簡介&#xff1a;Java領域優質創作者、CSDN博客專家、阿里云專家博主、公司架構師、全網粉絲5萬、專注Java技術領域和畢業設計項目實戰&#xff0c;歡迎高校老師\講師\同行交流合作 ?主要內容&#xff1a;畢業設計(Javaweb項目|小程序|Pyt…

Stable Diffusion 模型分享:FenrisXL(芬里斯XL)

本文收錄于《AI繪畫從入門到精通》專欄,專欄總目錄:點這里。 文章目錄 模型介紹生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十

IO進程線程第6天

1.使用有名管道完成兩個進程的相互通信 send.c代碼如下&#xff1a; #include <myhead.h>int main(int argc, const char *argv[]) {pid_t pidfork();if(pid>0){//父進程//從管道1中讀取數據int fd-1;if((fdopen("./mkfifo1",O_RDONLY))-1){perror("…

【安卓基礎3】Activity(一)

&#x1f3c6;作者簡介&#xff1a;|康有為| &#xff0c;大四在讀&#xff0c;目前在小米安卓實習&#xff0c;畢業入職 &#x1f3c6;本文收錄于 安卓學習大全&#xff0c;歡迎關注 &#x1f3c6;安卓學習資料推薦&#xff1a; 視頻&#xff1a;b站搜動腦學院 視頻鏈接 &…

微信小程序開發教程:

準備工作 下載并安裝微信開發者工具注冊微信公眾平臺賬號并創建小程序項目 項目結構 app.js&#xff1a;小程序的入口文件&#xff0c;用于定義全局變量和函數app.json&#xff1a;小程序的全局配置文件&#xff0c;用于配置小程序的頁面、窗口樣式、網絡超時時間等app.wxss&am…

反光衣實時識別檢測系統-反光衣穿戴識別系統-智慧工地系統安全帽佩戴---豌豆云

反光衣實時識別檢測系統是根據視頻流的自動化圖像識別檢測&#xff0c;運用前沿的深度神經網絡與云計算技術&#xff0c;替代工作人員的眼睛。 在工地、化工廠、煤礦石化等生產安全地區部署反光衣實時識別檢測系統&#xff0c;運用現場已有的視頻監控可以無死角全自動檢測生產…

Sora橫空出世!AI將如何撬動未來?

近日&#xff0c;OpenAI 發布首個視頻生成“Sora”模型&#xff0c;該模型通過接收文字指令&#xff0c;即可生成60秒的短視頻。 而在2022年末&#xff0c;同樣是OpenAI發布的AI語言模型ChatGPT&#xff0c;簡化了文本撰寫、創意構思以及代碼校驗等任務。用戶僅需輸入一個指令&…

【IC設計】Chisel API之Arbiter和RRArbiter的使用

文章目錄 介紹Chisel的Valid和Ready流控build.sbtRRArbiter代碼示例 介紹 仲裁器在NoC路由器中是重要的組成部分&#xff0c;虛通道仲裁和交叉開關仲裁都需要使用仲裁器。 Chisel提供了Arbiter和RRArbiter仲裁器 Arbiter是基礎的低位優先仲裁器&#xff0c; RRArbiter初始情況…

前端構建效率優化之路

項目背景 我們的系統&#xff08;一個 ToB 的 Web 單頁應用&#xff09;前端單頁應用經過多年的迭代&#xff0c;目前已經累積有大幾十萬行的業務代碼&#xff0c;30 路由模塊&#xff0c;整體的代碼量和復雜度還是比較高的。 項目整體是基于 Vue TypeScirpt&#xff0c;而構…

ProtoBuf認識與Windows下的安裝

protobuf簡介 Protobuf 是 Protocol Buffers 的簡稱&#xff0c;它是 Google 公司開發的一種數據描述語言&#xff0c;是一種輕便高效的結 構化數據存儲格式&#xff0c;可以用于結構化數據&#xff0c;或者說序列化。它很適合做數據存儲 或 RPC 數據交換格 式 。可用于通訊…

WebServer -- 定時器處理非活動連接(上)

目錄 &#x1f34d;函數指針 &#x1f33c;基礎知識 &#x1f419;整體概述 &#x1f382;基礎API sigaction 結構體 sigaction() sigfillset() SIGALRM, SIGTERM 信號 alarm() socketpair() send() &#x1f4d5;信號通知流程 統一事件源 信號處理機制 &#x…

2024全球網絡安全展望|構建協同生態,護航數字經濟

2024年1月&#xff0c;世界經濟論壇發布《2024全球網絡安全展望》報告&#xff0c;指出在科技快速發展的背景下&#xff0c;網絡安全不均衡問題加劇&#xff0c;需加強公共部門、企業組織和個人的合作。 報告強調&#xff0c;面對地緣政治動蕩、技術不確定性和全球經濟波動&am…

基于springboot+vue的美發門店管理系統(前后端分離)

博主主頁&#xff1a;貓頭鷹源碼 博主簡介&#xff1a;Java領域優質創作者、CSDN博客專家、阿里云專家博主、公司架構師、全網粉絲5萬、專注Java技術領域和畢業設計項目實戰&#xff0c;歡迎高校老師\講師\同行交流合作 ?主要內容&#xff1a;畢業設計(Javaweb項目|小程序|Pyt…

Python 高級語法:一切皆對象

1 “一切皆對象”是一種核心設計哲學 在編程領域&#xff0c;特別是面向對象編程&#xff08;OOP&#xff09;中&#xff0c;“一切皆對象”是一種核心設計哲學。這種哲學主張&#xff0c;無論是數據、函數、還是更復雜的結構&#xff0c;都可以被視為對象&#xff0c;并賦予…

信息安全基本概念匯總

目錄 一、安全加密算法相關 二、信息安全需求規范相關 三、安全啟動 四、安全更新 五、安全通信SecOC 六、HSM安全固件整體架構 一、安全加密算法相關 基于Autosar的網絡安全理解_搜狐汽車_搜狐網 基于AES的CMAC算法、MAC、Hash、數字簽名之間的關系_aes cmac-CSDN博客…

Cartographer框架簡述

catographer框架分為前端和后端 前端包括雷達數據處理&#xff1b;位姿預測&#xff1b;掃描匹配和柵格地圖更新。 后端包括后端&#xff1a;線程池任務與調度&#xff1b;向位姿圖添加節點&#xff0c;計算節點的子圖內約束和子圖間約束&#xff08;回環檢測&#xff09;&…

C++之Easyx——圖形庫的基本功能(1):界面操作

最近&#xff0c;我覺得使用控制臺編寫游戲太沒意思了&#xff01;&#xff01; 所以我開始研究圖形庫了~ 一、setinitmode 函數定義 void EGEAPI setinitmode(int mode, int x CW_USEDEFAULT, int y CW_USEDEFAULT); //設置初始化模式&#xff0c;mode0為普通&#xff0c…

Spark中寫parquet文件是怎么實現的

背景 本文基于 Spark 3.5.0 寫本篇文章的目的是在于能夠配合spark.sql.maxConcurrentOutputFileWriters參數來加速寫parquet文件的速度&#xff0c;為此研究一下Spark寫parquet的時候會占用內存的大小&#xff0c;便于配置spark.sql.maxConcurrentOutputFileWriters的值&#…

Javascript怎么輸出內容?兩種常見方式以及控制臺介紹

javascript是一種非常重要的編程語言&#xff0c;在許多網頁中它被廣泛使用&#xff0c;可以實現許多交互效果和動態效果。輸出是javascript中最基本的操作之一&#xff0c;下面將介紹兩種常見的輸出方式。 一、使用console.log()函數輸出 console.log()函數是常用的輸出函數…