Skip to content

Commit f67c66d

Browse files
authored
feat: compress image (#990)
1 parent 9d47f7a commit f67c66d

File tree

2 files changed

+33
-4
lines changed

2 files changed

+33
-4
lines changed

apps/web/src/components/CodemirrorEditor/UploadImgDialog.vue

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -339,20 +339,26 @@ const options = [
339339
]
340340
341341
const imgHost = ref(`default`)
342-
342+
const useCompression = ref(false)
343343
const activeName = ref(`upload`)
344344
345345
onBeforeMount(() => {
346346
if (localStorage.getItem(`imgHost`)) {
347347
imgHost.value = localStorage.getItem(`imgHost`)!
348348
}
349+
const storedCompression = localStorage.getItem(`useCompression`)
350+
if (storedCompression !== null) {
351+
useCompression.value = storedCompression === `true`
352+
}
349353
})
350354
351355
function changeImgHost() {
352356
localStorage.setItem(`imgHost`, imgHost.value)
353357
toast.success(`图床已切换`)
354358
}
355-
359+
function changeCompression() {
360+
localStorage.setItem(`useCompression`, useCompression.value.toString())
361+
}
356362
function beforeImageUpload(file: File) {
357363
// check image
358364
const checkResult = checkImage(file)
@@ -471,6 +477,16 @@ function emitUploads(file: File) {
471477
</SelectContent>
472478
</Select>
473479
</Label>
480+
<Label label="UseCompression">
481+
<span class="my-4 block">
482+
开启图片压缩
483+
</span>
484+
<Switch
485+
v-model:checked="useCompression"
486+
name="UseCompression"
487+
@update:checked="changeCompression"
488+
/>
489+
</Label>
474490
<div
475491
class="bg-clip-padding mt-4 h-50 relative flex flex-col cursor-pointer items-center justify-evenly border-2 rounded border-dashed transition-colors hover:border-gray-700 hover:bg-gray-400/50 dark:hover:border-gray-200 dark:hover:bg-gray-500/50"
476492
:class="{

apps/web/src/views/CodemirrorEditor.vue

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
<script setup lang="ts">
22
import type { Editor } from 'codemirror'
33
import type { ComponentPublicInstance } from 'vue'
4+
import imageCompression from 'browser-image-compression'
45
import { fromTextArea } from 'codemirror'
56
import { Eye, Pen } from 'lucide-vue-next'
67
import {
@@ -189,15 +190,27 @@ function uploaded(imageUrl: string) {
189190
}
190191
191192
const isImgLoading = ref(false)
192-
193+
async function compressImage(file: File) {
194+
const options = {
195+
maxSizeMB: 1,
196+
maxWidthOrHeight: 1920,
197+
useWebWorker: true,
198+
}
199+
const compressedFile = await imageCompression(file, options)
200+
return compressedFile
201+
}
193202
async function uploadImage(
194203
file: File,
195204
cb?: { (url: any, data: string): void, (arg0: unknown): void } | undefined,
196205
applyUrl?: boolean,
197206
) {
198207
try {
199208
isImgLoading.value = true
200-
209+
// compress image if useCompression is true
210+
const useCompression = localStorage.getItem(`useCompression`) === `true`
211+
if (useCompression) {
212+
file = await compressImage(file)
213+
}
201214
const base64Content = await toBase64(file)
202215
const url = await fileUpload(base64Content, file)
203216
if (cb) {

0 commit comments

Comments
 (0)