11// 复制到剪贴板
22export async function copyToClipboard ( content : string ) : Promise < boolean > {
3- if ( ! content )
4- return false ;
3+ if ( ! content ) return false ;
54
65 try {
76 if ( navigator . clipboard && window . isSecureContext ) {
87 await navigator . clipboard . writeText ( content ) ;
98 return true ;
10- }
11- else {
9+ } else {
1210 const textArea = document . createElement ( 'textarea' ) ;
1311 textArea . value = content ;
1412 textArea . style . position = 'fixed' ;
@@ -21,30 +19,41 @@ export async function copyToClipboard(content: string): Promise<boolean> {
2119 textArea . remove ( ) ;
2220 return true ;
2321 }
24- }
25- catch ( err ) {
22+ } catch ( err ) {
2623 console . error ( '复制失败: ' , err ) ;
2724 return false ;
2825 }
2926}
3027
3128// SVG下载功能
32- export function downloadSvgAsPng ( svg : string ) : void {
33- if ( ! svg )
34- return ;
29+ /**
30+ * DownloadOptions
31+ * @scale 2:标准分辨率;4:高分辨率(默认); 8:超高分辨率
32+ * @quality 0.8:良好质量,文件较小;0.9:良好质量,文件适中;1.0:无损质量(默认)
33+ */
34+ interface DownloadOptions {
35+ scale ?: number ; // 缩放因子,默认4
36+ quality ?: number ; // 图片质量,默认1.0
37+ format ?: string ; // 图片格式,默认'image/png'
38+ }
39+ export function downloadSvgAsPng (
40+ svg : string ,
41+ options : DownloadOptions = { }
42+ ) : void {
43+ if ( ! svg ) return ;
3544
3645 try {
46+ const { scale = 4 , quality = 1.0 , format = 'image/png' } = options ;
47+
3748 const svgDataUrl = `data:image/svg+xml;charset=utf-8,${ encodeURIComponent ( svg ) } ` ;
3849 const img = new Image ( ) ;
3950
4051 img . onload = ( ) => {
4152 try {
4253 const canvas = document . createElement ( 'canvas' ) ;
4354 const ctx = canvas . getContext ( '2d' , { willReadFrequently : false } ) ;
44- if ( ! ctx )
45- return ;
55+ if ( ! ctx ) return ;
4656
47- const scale = 2 ;
4857 canvas . width = img . width * scale ;
4958 canvas . height = img . height * scale ;
5059 ctx . imageSmoothingEnabled = true ;
@@ -66,8 +75,7 @@ export function downloadSvgAsPng(svg: string): void {
6675 try {
6776 canvas . toBlob (
6877 blob => {
69- if ( ! blob )
70- return ;
78+ if ( ! blob ) return ;
7179 const url = URL . createObjectURL ( blob ) ;
7280 const link = document . createElement ( 'a' ) ;
7381 link . href = url ;
@@ -77,11 +85,10 @@ export function downloadSvgAsPng(svg: string): void {
7785 document . body . removeChild ( link ) ;
7886 URL . revokeObjectURL ( url ) ;
7987 } ,
80- 'image/png' ,
81- 0.95
88+ format ,
89+ quality
8290 ) ;
83- }
84- catch ( toBlobError ) {
91+ } catch ( toBlobError ) {
8592 console . error ( 'toBlobError:' , toBlobError ) ;
8693 // 降级方案
8794 try {
@@ -92,13 +99,11 @@ export function downloadSvgAsPng(svg: string): void {
9299 document . body . appendChild ( link ) ;
93100 link . click ( ) ;
94101 document . body . removeChild ( link ) ;
95- }
96- catch ( dataUrlError ) {
102+ } catch ( dataUrlError ) {
97103 console . error ( 'dataUrlError:' , dataUrlError ) ;
98104 }
99105 }
100- }
101- catch ( canvasError ) {
106+ } catch ( canvasError ) {
102107 console . error ( 'Canvas操作失败:' , canvasError ) ;
103108 }
104109 } ;
@@ -108,8 +113,7 @@ export function downloadSvgAsPng(svg: string): void {
108113 } ;
109114
110115 img . src = svgDataUrl ;
111- }
112- catch ( error ) {
116+ } catch ( error ) {
113117 console . error ( '下载失败:' , error ) ;
114118 }
115119}
0 commit comments