diff --git a/src/types/slides.ts b/src/types/slides.ts index a53277c9..a8471f44 100644 --- a/src/types/slides.ts +++ b/src/types/slides.ts @@ -211,6 +211,18 @@ export interface ImageElementClip { shape: string } +/** + * 图片蒙版 + * + * color: 蒙版颜色 + * + * opacity: 蒙版透明度 + */ +export interface ImageColorElementMask { + color: string + opacity: number +} + /** * 图片元素 * @@ -242,6 +254,7 @@ export interface PPTImageElement extends PPTBaseElement { flipH?: boolean flipV?: boolean shadow?: PPTElementShadow + colorMask?: ImageColorElementMask } diff --git a/src/views/Editor/Toolbar/ElementStylePanel/ImageStylePanel.vue b/src/views/Editor/Toolbar/ElementStylePanel/ImageStylePanel.vue index 6c3adc11..423ee8ed 100644 --- a/src/views/Editor/Toolbar/ElementStylePanel/ImageStylePanel.vue +++ b/src/views/Editor/Toolbar/ElementStylePanel/ImageStylePanel.vue @@ -41,6 +41,8 @@ + + @@ -70,6 +72,7 @@ import ElementOutline from '../common/ElementOutline.vue' import ElementShadow from '../common/ElementShadow.vue' import ElementFlip from '../common/ElementFlip.vue' import ElementFilter from '../common/ElementFilter.vue' +import ElementColorMask from '../common/ElementColorMask.vue' const shapeClipPathOptions = CLIPPATHS const ratioClipOptions = [ @@ -235,7 +238,7 @@ const resetImage = () => { slidesStore.removeElementProps({ id: handleElementId.value, - propName: ['clip', 'outline', 'flip', 'shadow', 'filters'], + propName: ['clip', 'outline', 'flip', 'shadow', 'filters', 'colorMask'], }) addHistorySnapshot() } diff --git a/src/views/Editor/Toolbar/common/ElementColorMask.vue b/src/views/Editor/Toolbar/common/ElementColorMask.vue new file mode 100644 index 00000000..0030290c --- /dev/null +++ b/src/views/Editor/Toolbar/common/ElementColorMask.vue @@ -0,0 +1,100 @@ + + + + + \ No newline at end of file diff --git a/src/views/components/element/ImageElement/BaseImageElement.vue b/src/views/components/element/ImageElement/BaseImageElement.vue index 78c44f84..94ff89ee 100644 --- a/src/views/components/element/ImageElement/BaseImageElement.vue +++ b/src/views/components/element/ImageElement/BaseImageElement.vue @@ -34,6 +34,13 @@ }" alt="" /> +
@@ -95,4 +102,11 @@ const { filter } = useFilter(filters) position: absolute; } } +.color-mask { + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; +} diff --git a/src/views/components/element/ImageElement/index.vue b/src/views/components/element/ImageElement/index.vue index 409b61eb..1b7fdbc4 100644 --- a/src/views/components/element/ImageElement/index.vue +++ b/src/views/components/element/ImageElement/index.vue @@ -52,6 +52,13 @@ @dragstart.prevent alt="" /> +
@@ -185,4 +192,11 @@ const handleClip = (data: ImageClipedEmitData | null) => { position: absolute; } } +.color-mask { + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; +}