From 98f0de6c56917010f370fa11b29633a523b424ed Mon Sep 17 00:00:00 2001 From: syuilo <4439005+syuilo@users.noreply.github.com> Date: Thu, 29 May 2025 09:36:47 +0900 Subject: [PATCH] wip --- locales/index.d.ts | 12 ++ locales/ja-JP.yml | 3 + .../MkImageEffectorDialog.Layer.vue | 3 +- .../src/components/MkImageEffectorDialog.vue | 18 ++- .../src/components/MkUploaderDialog.vue | 2 + .../components/MkWatermarkEditorDialog.vue | 3 + .../pages/settings/drive.WatermarkItem.vue | 2 + .../utility/image-effector/ImageEffector.ts | 31 ++---- .../src/utility/image-effector/fxs.ts | 25 +++++ .../utility/image-effector/fxs/colorClamp.ts | 60 ++++++++++ .../image-effector/fxs/colorClampAdvanced.ts | 104 ++++++++++++++++++ .../utility/image-effector/fxs/grayscale.ts | 40 +++++++ 12 files changed, 277 insertions(+), 26 deletions(-) create mode 100644 packages/frontend/src/utility/image-effector/fxs.ts create mode 100644 packages/frontend/src/utility/image-effector/fxs/colorClamp.ts create mode 100644 packages/frontend/src/utility/image-effector/fxs/colorClampAdvanced.ts create mode 100644 packages/frontend/src/utility/image-effector/fxs/grayscale.ts diff --git a/locales/index.d.ts b/locales/index.d.ts index ff2019e871..d08af02dd9 100644 --- a/locales/index.d.ts +++ b/locales/index.d.ts @@ -12092,6 +12092,18 @@ export interface Locale extends ILocale { * 色の反転 */ "invert": string; + /** + * 白黒 + */ + "grayscale": string; + /** + * 色の圧縮 + */ + "colorClamp": string; + /** + * 色の圧縮(高度) + */ + "colorClampAdvanced": string; }; }; } diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index ad62d74c66..42e496a8ce 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -3241,3 +3241,6 @@ _imageEffector: glitch: "グリッチ" mirror: "ミラー" invert: "色の反転" + grayscale: "白黒" + colorClamp: "色の圧縮" + colorClampAdvanced: "色の圧縮(高度)" diff --git a/packages/frontend/src/components/MkImageEffectorDialog.Layer.vue b/packages/frontend/src/components/MkImageEffectorDialog.Layer.vue index bd38248d29..5e3981669c 100644 --- a/packages/frontend/src/components/MkImageEffectorDialog.Layer.vue +++ b/packages/frontend/src/components/MkImageEffectorDialog.Layer.vue @@ -37,7 +37,7 @@ import { ref, useTemplateRef, watch, onMounted, onUnmounted } from 'vue'; import { v4 as uuid } from 'uuid'; import type { ImageEffectorLayer } from '@/utility/image-effector/ImageEffector.js'; import { i18n } from '@/i18n.js'; -import { FXS, ImageEffector } from '@/utility/image-effector/ImageEffector.js'; +import { ImageEffector } from '@/utility/image-effector/ImageEffector.js'; import MkFolder from '@/components/MkFolder.vue'; import MkButton from '@/components/MkButton.vue'; import MkInput from '@/components/MkInput.vue'; @@ -50,6 +50,7 @@ import * as os from '@/os.js'; import { selectFile } from '@/utility/drive.js'; import { misskeyApi } from '@/utility/misskey-api.js'; import { prefer } from '@/preferences.js'; +import { FXS } from '@/utility/image-effector/fxs.js'; const layer = defineModel('layer', { required: true }); const fx = FXS.find((fx) => fx.id === layer.value.fxId); diff --git a/packages/frontend/src/components/MkImageEffectorDialog.vue b/packages/frontend/src/components/MkImageEffectorDialog.vue index a7c593f1b6..f240e0f94c 100644 --- a/packages/frontend/src/components/MkImageEffectorDialog.vue +++ b/packages/frontend/src/components/MkImageEffectorDialog.vue @@ -23,6 +23,8 @@ SPDX-License-Identifier: AGPL-3.0-only
{{ i18n.ts.preview }}
+ +
@@ -49,7 +51,7 @@ import { v4 as uuid } from 'uuid'; import type { WatermarkPreset } from '@/utility/watermark.js'; import type { ImageEffectorLayer } from '@/utility/image-effector/ImageEffector.js'; import { i18n } from '@/i18n.js'; -import { FXS, ImageEffector } from '@/utility/image-effector/ImageEffector.js'; +import { ImageEffector } from '@/utility/image-effector/ImageEffector.js'; import MkModalWindow from '@/components/MkModalWindow.vue'; import MkSelect from '@/components/MkSelect.vue'; import MkButton from '@/components/MkButton.vue'; @@ -57,6 +59,7 @@ import MkInput from '@/components/MkInput.vue'; import XLayer from '@/components/MkImageEffectorDialog.Layer.vue'; import * as os from '@/os.js'; import { deepClone } from '@/utility/clone.js'; +import { FXS } from '@/utility/image-effector/fxs.js'; const props = defineProps<{ image: HTMLImageElement; @@ -114,6 +117,7 @@ onMounted(async () => { height: props.image.height, layers: layers, originalImage: props.image, + fxs: FXS, }); await renderer!.bakeTextures(); @@ -135,6 +139,18 @@ function save() { dialog.value?.close(); }, 'image/png'); } + +const enabled = ref(true); +watch(enabled, () => { + if (renderer != null) { + if (enabled.value) { + renderer.updateLayers(layers); + } else { + renderer.updateLayers([]); + } + renderer.render(); + } +});