@@ -16,6 +16,7 @@ const app = createApp({
16
16
editable : false ,
17
17
currentFile : null ,
18
18
isImage : false ,
19
+ isHeic : false ,
19
20
isVideo : false ,
20
21
isText : false ,
21
22
isFont : false ,
@@ -90,6 +91,11 @@ const app = createApp({
90
91
return imageExtensions . some ( ext => filename . toLowerCase ( ) . endsWith ( ext ) ) ;
91
92
} ;
92
93
94
+ // 检查是否为HEIC/HEIF格式图片
95
+ const isHeicImage = ( filename ) => {
96
+ return filename . toLowerCase ( ) . endsWith ( '.heic' ) || filename . toLowerCase ( ) . endsWith ( '.heif' ) ;
97
+ } ;
98
+
93
99
// 检查文件是否为视频
94
100
const isVideoFile = ( filename ) => {
95
101
const videoExtensions = [ '.mp4' , '.webm' , '.ogg' , '.mov' , '.mkv' , '.avi' ] ;
@@ -112,6 +118,7 @@ const app = createApp({
112
118
editable : type === 'text' ,
113
119
currentFile : item ,
114
120
isImage : type === 'image' ,
121
+ isHeic : type === 'heic' ,
115
122
isVideo : type === 'video' ,
116
123
isText : type === 'text' ,
117
124
isFont : type === 'font' ,
@@ -122,9 +129,49 @@ const app = createApp({
122
129
} ;
123
130
} ;
124
131
132
+ // 处理HEIC图片预览
133
+ const handleHeicPreview = async ( item ) => {
134
+ // Show loading message
135
+ ElMessage ( {
136
+ message : 'Converting HEIC image...' ,
137
+ type : 'info' ,
138
+ duration : 0
139
+ } ) ;
140
+
141
+ try {
142
+ // Fetch the HEIC file
143
+ const response = await fetch ( `/raw/${ item . path } ` ) ;
144
+ const blob = await response . blob ( ) ;
145
+
146
+ // Convert HEIC to JPEG
147
+ const jpegBlob = await heic2any ( {
148
+ blob : blob ,
149
+ toType : "image/jpeg" ,
150
+ quality : 0.8
151
+ } ) ;
152
+
153
+ // Create object URL for the converted image
154
+ const imageUrl = URL . createObjectURL ( jpegBlob ) ;
155
+
156
+ // Close loading message
157
+ ElMessage . closeAll ( ) ;
158
+
159
+ return {
160
+ ...createPreviewConfig ( item , 'heic' ) ,
161
+ content : imageUrl
162
+ } ;
163
+ } catch ( error ) {
164
+ ElMessage . error ( 'Failed to convert HEIC image' ) ;
165
+ console . error ( 'HEIC conversion error:' , error ) ;
166
+ throw error ;
167
+ }
168
+ } ;
169
+
125
170
const openFile = async ( item ) => {
126
171
try {
127
- if ( isImageFile ( item . name ) ) {
172
+ if ( isHeicImage ( item . name ) ) {
173
+ previewDialog . value = await handleHeicPreview ( item ) ;
174
+ } else if ( isImageFile ( item . name ) ) {
128
175
previewDialog . value = createPreviewConfig ( item , 'image' ) ;
129
176
} else if ( isVideoFile ( item . name ) ) {
130
177
previewDialog . value = createPreviewConfig ( item , 'video' ) ;
@@ -459,12 +506,30 @@ const app = createApp({
459
506
} ;
460
507
461
508
// 更新预览图片
462
- const updatePreviewImage = ( image , index ) => {
509
+ const updatePreviewImage = async ( image , index ) => {
463
510
if ( image ) {
464
511
previewDialog . value . currentImageIndex = index ;
465
512
previewDialog . value . title = image . name ;
466
- previewDialog . value . content = `/raw/${ image . path } ` ;
467
513
previewDialog . value . currentFile = image ;
514
+
515
+ if ( isHeicImage ( image . name ) ) {
516
+ try {
517
+ const previewConfig = await handleHeicPreview ( image ) ;
518
+ previewDialog . value = {
519
+ ...previewConfig ,
520
+ currentImageIndex : index
521
+ } ;
522
+ } catch ( error ) {
523
+ // If HEIC conversion fails, fall back to raw path
524
+ previewDialog . value = {
525
+ ...createPreviewConfig ( image , 'heic' ) ,
526
+ content : `/raw/${ image . path } ` ,
527
+ currentImageIndex : index
528
+ } ;
529
+ }
530
+ } else {
531
+ previewDialog . value . content = `/raw/${ image . path } ` ;
532
+ }
468
533
}
469
534
} ;
470
535
0 commit comments