Skip to content

Commit

Permalink
图片处理
Browse files Browse the repository at this point in the history
  • Loading branch information
sunsan2002 committed Apr 3, 2024
1 parent 70a1477 commit 3ba1ad6
Show file tree
Hide file tree
Showing 8 changed files with 1,168 additions and 88 deletions.
3 changes: 2 additions & 1 deletion auto-imports.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,6 @@
// Generated by unplugin-auto-import
export {}
declare global {

const ElMess: typeof import('element-plus/es')['ElMess']
const ElMessage: typeof import('element-plus/es')['ElMessage']
}
3 changes: 0 additions & 3 deletions components.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,4 @@ declare module 'vue' {
RouterLink: typeof import('vue-router')['RouterLink']
RouterView: typeof import('vue-router')['RouterView']
}
export interface ComponentCustomProperties {
vLoading: typeof import('element-plus/es')['ElLoadingDirective']
}
}
961 changes: 879 additions & 82 deletions package-lock.json

Large diffs are not rendered by default.

3 changes: 3 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
"@fortawesome/free-regular-svg-icons": "^6.5.1",
"@fortawesome/free-solid-svg-icons": "^6.5.1",
"@fortawesome/vue-fontawesome": "3.0.6",
"@toast-ui/vue-image-editor": "^3.15.2",
"@types/node": "^20.11.26",
"@types/showdown": "^2.0.6",
"aliplayer": "^1.0.3",
Expand All @@ -29,6 +30,8 @@
"pinia-plugin-persist": "^1.0.0",
"pinia-plugin-persistedstate": "^3.2.1",
"pnpm": "^8.15.5",
"sass": "^1.72.0",
"sass-loader": "^14.1.1",
"showdown": "^2.1.0",
"showdown-katex": "^0.8.0",
"undraw-ui": "^1.0.7",
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
9 changes: 7 additions & 2 deletions src/component/ImagePreview.vue
Original file line number Diff line number Diff line change
Expand Up @@ -40,13 +40,14 @@
<el-button link class="btn" @click="downLoad"
><el-icon size="30px" class="icon"><Download /></el-icon
></el-button>
<el-button link class="btn" @click="downLoad"
<el-button link class="btn" @click="update"
><img class="icon" src="..\..\public\static\icon\编辑.png" /></el-button>
</div>
</el-dialog>
</template>

<script setup>
import router from "@/router";
import { computed, onMounted, ref } from "vue";

const props = defineProps({
Expand Down Expand Up @@ -97,6 +98,10 @@ const close = () => {
src.value = "";
emit("close");
};

const update = () => {
router.push('/imageProcessing')
}
</script>

<style scoped>
Expand Down Expand Up @@ -149,7 +154,7 @@ const close = () => {
}
.icon {
color: #fff;
height: 100px;
height: 70px;
}
.btn {
height: 50px;
Expand Down
4 changes: 4 additions & 0 deletions src/router/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,10 @@ const routes: Array<RouteRecordRaw> = [
path: "/imgPreview", //图片预览组件
component: () => import("@/component/ImagePreview.vue"),
},
{
path: "/imageProcessing", //图片预览组件
component: () => import("@/views/ImageProcessing.vue"),
}
],
},
{
Expand Down
273 changes: 273 additions & 0 deletions src/views/ImageProcessing.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,273 @@
<template>
<div class="drawing-container">
<!-- 绘图组件容器DOM -->
<div id="tui-image-editor"></div>
<el-button class="save" type="primary" size="small" @click="save"
>下载</el-button
>
</div>
</template>
<script>
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 { ElMessageBox } from "element-plus";
import router from "@/router";
// 中文菜单sass-loader
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",
};
export default {
props: {
image: {
type: Object,
default: () => ({
title: "【重磅干货】大家都关心的嘉宾PPT下载指南来啦!",
img: "https://s2.loli.net/2024/04/03/57w8v3bRUgBypkl.jpg",
id: 1,
}),
},
},
name: "ImgTui",
data() {
return {
instance: null, // 创建的画布对象
// image: {
// title: "【重磅干货】大家都关心的嘉宾PPT下载指南来啦!",
// img: "https://lf3-cdn-tos.bytescm.com/obj/ttfe/xevaluation/ima-pingjia-default.png",
// id: 1,
// },
};
},
mounted() {
console.log(this.image);
this.init(); // 页面创建完成后调用
},
methods: {
init() {
console.log(this.image.img);
this.instance = new ImageEditor(
document.querySelector("#tui-image-editor"),
{
includeUI: {
loadImage: {
path: this.image.img,
name: this.image.title,
},
menu: [
"resize",
"crop",
"rotate",
"draw",
"shape",
"icon",
"text",
"filter",
], // 底部菜单按钮列表 隐藏镜像flip和遮罩mask
initMenu: "draw", // 默认打开的菜单项
menuBarPosition: "bottom", // 菜单所在的位置
locale: locale_zh, // 本地化语言为中文
theme: customTheme, // 自定义样式
},
cssMaxWidth: 500, // canvas 最大宽度
cssMaxHeight: 600, // canvas 最大高度
}
);
document.getElementsByClassName("tui-image-editor-main")[0].style.top =
"70px"; // 调整图片显示位置
document.getElementsByClassName(
"tie-btn-reset tui-image-editor-item help"
)[0].style.display = "none"; // 隐藏顶部重置按钮
},
// 保存图片,并上传
save() {
const xhr = new XMLHttpRequest();
const src = this.image.img;
xhr.open("GET", src, true);
xhr.responseType = "blob";
xhr.onload = function () {
const blob = new Blob([this.response], {
type: "application/octet-stream",
});
const link = document.createElement("a");
link.href = window.URL.createObjectURL(blob);
link.download = src.split("/").pop();
document.body.appendChild(link);
link.click();
};
xhr.send();
ElMessageBox.alert("保存成功", "提示").then(() => {
this.$router.back();
});
},
},
};
</script>

<style scoped>
.drawing-container {
height: 60vh;
width: 60vw;
position: relative;
left: 50%;
top: 50%;
transform: translate(-50%, 0);
margin-top: 300px;
margin-bottom: 300px;
}
.save {
position: absolute;
right: 50px;
top: 15px;
}
</style>

0 comments on commit 3ba1ad6

Please sign in to comment.