@jjlmoya/utils-converters 1.25.0 → 1.26.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +2 -2
- package/src/category/i18n/de.ts +1 -1
- package/src/category/i18n/en.ts +1 -1
- package/src/category/i18n/fr.ts +1 -1
- package/src/category/i18n/id.ts +1 -1
- package/src/category/i18n/it.ts +1 -1
- package/src/category/i18n/nl.ts +1 -1
- package/src/category/i18n/pl.ts +1 -1
- package/src/category/i18n/pt.ts +1 -1
- package/src/category/i18n/sv.ts +1 -1
- package/src/tests/bibliography_wellformed_export.test.ts +46 -0
- package/src/tests/category_seo_quality.test.ts +74 -0
- package/src/tests/faq_count.test.ts +1 -1
- package/src/tests/no_h1_in_components.test.ts +1 -1
- package/src/tests/seo_parity.test.ts +2 -2
- package/src/tests/seo_wellformed_export.test.ts +65 -0
- package/src/tests/tool_validation.test.ts +15 -15
- package/src/tool/avifAJpg/i18n/en.ts +164 -164
- package/src/tool/avifAJpg/i18n/es.ts +164 -164
- package/src/tool/avifAJpg/i18n/fr.ts +164 -164
- package/src/tool/avifAJpg/i18n/ja.ts +166 -166
- package/src/tool/avifAJpg/i18n/ko.ts +166 -166
- package/src/tool/avifAJpg/i18n/zh.ts +166 -166
- package/src/tool/avifAJpg/seo.astro +15 -15
- package/src/tool/avifAPng/i18n/en.ts +164 -164
- package/src/tool/avifAPng/i18n/es.ts +164 -164
- package/src/tool/avifAPng/i18n/fr.ts +164 -164
- package/src/tool/avifAPng/i18n/ja.ts +166 -166
- package/src/tool/avifAPng/i18n/ko.ts +166 -166
- package/src/tool/avifAPng/i18n/zh.ts +166 -166
- package/src/tool/avifAPng/seo.astro +15 -15
- package/src/tool/avifAWebp/i18n/en.ts +164 -164
- package/src/tool/avifAWebp/i18n/es.ts +164 -164
- package/src/tool/avifAWebp/i18n/fr.ts +164 -164
- package/src/tool/avifAWebp/i18n/ja.ts +166 -166
- package/src/tool/avifAWebp/i18n/ko.ts +166 -166
- package/src/tool/avifAWebp/i18n/zh.ts +166 -166
- package/src/tool/avifAWebp/seo.astro +15 -15
- package/src/tool/bmpAJpg/i18n/en.ts +164 -164
- package/src/tool/bmpAJpg/i18n/es.ts +164 -164
- package/src/tool/bmpAJpg/i18n/fr.ts +164 -164
- package/src/tool/bmpAJpg/i18n/ja.ts +166 -166
- package/src/tool/bmpAJpg/i18n/ko.ts +166 -166
- package/src/tool/bmpAJpg/i18n/zh.ts +166 -166
- package/src/tool/bmpAJpg/seo.astro +15 -15
- package/src/tool/bmpAPng/i18n/en.ts +164 -164
- package/src/tool/bmpAPng/i18n/es.ts +164 -164
- package/src/tool/bmpAPng/i18n/fr.ts +164 -164
- package/src/tool/bmpAPng/i18n/ja.ts +165 -165
- package/src/tool/bmpAPng/i18n/ko.ts +165 -165
- package/src/tool/bmpAPng/i18n/zh.ts +165 -165
- package/src/tool/bmpAPng/seo.astro +15 -15
- package/src/tool/bmpAWebp/i18n/en.ts +164 -164
- package/src/tool/bmpAWebp/i18n/es.ts +164 -164
- package/src/tool/bmpAWebp/i18n/fr.ts +164 -164
- package/src/tool/bmpAWebp/i18n/ja.ts +166 -166
- package/src/tool/bmpAWebp/i18n/ko.ts +166 -166
- package/src/tool/bmpAWebp/i18n/zh.ts +166 -166
- package/src/tool/bmpAWebp/seo.astro +15 -15
- package/src/tool/gifAJpg/i18n/en.ts +164 -164
- package/src/tool/gifAJpg/i18n/es.ts +164 -164
- package/src/tool/gifAJpg/i18n/fr.ts +164 -164
- package/src/tool/gifAJpg/i18n/ja.ts +166 -166
- package/src/tool/gifAJpg/i18n/ko.ts +166 -166
- package/src/tool/gifAJpg/i18n/zh.ts +166 -166
- package/src/tool/gifAJpg/seo.astro +15 -15
- package/src/tool/gifAPng/i18n/en.ts +164 -164
- package/src/tool/gifAPng/i18n/es.ts +164 -164
- package/src/tool/gifAPng/i18n/fr.ts +164 -164
- package/src/tool/gifAPng/i18n/ja.ts +166 -166
- package/src/tool/gifAPng/i18n/ko.ts +166 -166
- package/src/tool/gifAPng/i18n/zh.ts +166 -166
- package/src/tool/gifAPng/seo.astro +15 -15
- package/src/tool/gifAWebp/i18n/en.ts +164 -164
- package/src/tool/gifAWebp/i18n/es.ts +164 -164
- package/src/tool/gifAWebp/i18n/fr.ts +164 -164
- package/src/tool/gifAWebp/i18n/ja.ts +166 -166
- package/src/tool/gifAWebp/i18n/ko.ts +166 -166
- package/src/tool/gifAWebp/i18n/zh.ts +166 -166
- package/src/tool/gifAWebp/seo.astro +15 -15
- package/src/tool/imagenBase64/i18n/en.ts +154 -154
- package/src/tool/imagenBase64/i18n/es.ts +154 -154
- package/src/tool/imagenBase64/i18n/fr.ts +154 -154
- package/src/tool/imagenBase64/seo.astro +15 -15
- package/src/tool/jpgAIco/seo.astro +15 -15
- package/src/tool/jpgAPng/i18n/en.ts +164 -164
- package/src/tool/jpgAPng/i18n/es.ts +164 -164
- package/src/tool/jpgAPng/i18n/fr.ts +164 -164
- package/src/tool/jpgAPng/i18n/ja.ts +166 -166
- package/src/tool/jpgAPng/i18n/ko.ts +166 -166
- package/src/tool/jpgAPng/i18n/zh.ts +166 -166
- package/src/tool/jpgAPng/seo.astro +15 -15
- package/src/tool/jpgAWebp/i18n/en.ts +164 -164
- package/src/tool/jpgAWebp/i18n/es.ts +164 -164
- package/src/tool/jpgAWebp/i18n/fr.ts +164 -164
- package/src/tool/jpgAWebp/seo.astro +15 -15
- package/src/tool/pngAIco/seo.astro +15 -15
- package/src/tool/pngAJpg/i18n/de.ts +21 -21
- package/src/tool/pngAJpg/i18n/es.ts +177 -177
- package/src/tool/pngAJpg/i18n/fr.ts +137 -137
- package/src/tool/pngAJpg/i18n/id.ts +89 -89
- package/src/tool/pngAJpg/i18n/it.ts +89 -89
- package/src/tool/pngAJpg/i18n/ko.ts +177 -177
- package/src/tool/pngAJpg/i18n/nl.ts +20 -20
- package/src/tool/pngAJpg/i18n/pl.ts +89 -89
- package/src/tool/pngAJpg/i18n/pt.ts +89 -89
- package/src/tool/pngAJpg/i18n/ru.ts +177 -177
- package/src/tool/pngAJpg/i18n/sv.ts +89 -89
- package/src/tool/pngAJpg/i18n/tr.ts +89 -89
- package/src/tool/pngAJpg/seo.astro +15 -15
- package/src/tool/pngAWebp/i18n/en.ts +164 -164
- package/src/tool/pngAWebp/i18n/es.ts +164 -164
- package/src/tool/pngAWebp/i18n/fr.ts +164 -164
- package/src/tool/pngAWebp/seo.astro +15 -15
- package/src/tool/svgAJpg/i18n/fr.ts +164 -164
- package/src/tool/svgAJpg/seo.astro +15 -15
- package/src/tool/svgAPng/i18n/fr.ts +164 -164
- package/src/tool/svgAPng/seo.astro +15 -15
- package/src/tool/webpAIco/seo.astro +15 -15
- package/src/tool/webpAJpg/seo.astro +15 -15
- package/src/tool/webpAPng/bibliography.ts +13 -13
- package/src/tool/webpAPng/i18n/de.ts +166 -166
- package/src/tool/webpAPng/i18n/es.ts +171 -171
- package/src/tool/webpAPng/i18n/fr.ts +166 -166
- package/src/tool/webpAPng/i18n/id.ts +166 -166
- package/src/tool/webpAPng/i18n/it.ts +166 -166
- package/src/tool/webpAPng/i18n/nl.ts +166 -166
- package/src/tool/webpAPng/i18n/pl.ts +166 -166
- package/src/tool/webpAPng/i18n/pt.ts +166 -166
- package/src/tool/webpAPng/i18n/ru.ts +166 -166
- package/src/tool/webpAPng/i18n/sv.ts +166 -166
- package/src/tool/webpAPng/i18n/tr.ts +167 -167
- package/src/tool/webpAPng/seo.astro +15 -15
|
@@ -1,168 +1,168 @@
|
|
|
1
1
|
import { bibliography } from '../bibliography';
|
|
2
|
-
import type { ImageConverterUI } from '../../../shared/ImageConverter.astro';
|
|
3
|
-
import { generateSchemas } from '../../../shared/logic/schemas';
|
|
4
|
-
import type { GifAJpgLocaleContent } from '../index';
|
|
5
|
-
|
|
6
|
-
const slug = 'gif-to-jpg-converter';
|
|
7
|
-
const title = '在线将 GIF 转换为 JPG';
|
|
8
|
-
const description =
|
|
9
|
-
'从 GIF 中提取第一帧并将其转换为 JPG。无需服务器。在您的浏览器中进行本地处理。免费且无限制。';
|
|
10
|
-
|
|
11
|
-
const ui: ImageConverterUI = {
|
|
12
|
-
dragText: '拖拽 GIF 文件...',
|
|
13
|
-
convertText: '立即将其转换为 JPG',
|
|
14
|
-
selectFiles: '选择文件',
|
|
15
|
-
processedFiles: '已处理文件',
|
|
16
|
-
downloadAll: '下载全部 (.zip)',
|
|
2
|
+
import type { ImageConverterUI } from '../../../shared/ImageConverter.astro';
|
|
3
|
+
import { generateSchemas } from '../../../shared/logic/schemas';
|
|
4
|
+
import type { GifAJpgLocaleContent } from '../index';
|
|
5
|
+
|
|
6
|
+
const slug = 'gif-to-jpg-converter';
|
|
7
|
+
const title = '在线将 GIF 转换为 JPG';
|
|
8
|
+
const description =
|
|
9
|
+
'从 GIF 中提取第一帧并将其转换为 JPG。无需服务器。在您的浏览器中进行本地处理。免费且无限制。';
|
|
10
|
+
|
|
11
|
+
const ui: ImageConverterUI = {
|
|
12
|
+
dragText: '拖拽 GIF 文件...',
|
|
13
|
+
convertText: '立即将其转换为 JPG',
|
|
14
|
+
selectFiles: '选择文件',
|
|
15
|
+
processedFiles: '已处理文件',
|
|
16
|
+
downloadAll: '下载全部 (.zip)',
|
|
17
17
|
pending: '等待中',
|
|
18
|
-
bibliographyTitle: '参考文献',
|
|
19
|
-
faqTitle: '常见问题',
|
|
20
|
-
};
|
|
21
|
-
|
|
22
|
-
const faq: GifAJpgLocaleContent['faq'] = [
|
|
23
|
-
{
|
|
24
|
-
question: '当我转换为 JPG 时,动画会发生什么?',
|
|
25
|
-
answer:
|
|
26
|
-
'JPG 格式严格来说是静态的,不支持多帧。我们的转换器仅提取 GIF 序列中出现的第一张图像或第一帧。',
|
|
27
|
-
},
|
|
28
|
-
{
|
|
29
|
-
question: '我会丢失任何特殊效果或透明背景吗?',
|
|
30
|
-
answer:
|
|
31
|
-
'是的,这是 JPG 标准的自然特性。如果您上传带有透明背景的 GIF,我们会自动在下方插入一个纯白色固态层,以避免颜色损坏。',
|
|
32
|
-
},
|
|
33
|
-
{
|
|
34
|
-
question: '我可以在网站不保存我的内容的情况下从 GIF 中提取 JPG 图片吗?',
|
|
35
|
-
answer:
|
|
36
|
-
'当然可以。该工具是基于 HTML5 Canvas 的 Web App。所有解码工作均由您自己的物理设备的处理器执行。',
|
|
37
|
-
},
|
|
38
|
-
];
|
|
39
|
-
|
|
40
|
-
const howTo: GifAJpgLocaleContent['howTo'] = [
|
|
41
|
-
{
|
|
42
|
-
name: '拖拽可移动的重型文件',
|
|
43
|
-
text: '将文件夹中的那个 GIF 拖拽到我们的处理框中。',
|
|
44
|
-
},
|
|
45
|
-
{
|
|
46
|
-
name: '干净的第一帧提取计算',
|
|
47
|
-
text: '在极短的时间内提取动画,生成纯白色背景的 JPG,无需接触服务器。',
|
|
48
|
-
},
|
|
49
|
-
{
|
|
50
|
-
name: '获取 ZIP 批量包',
|
|
51
|
-
text: '如果您处理了大量文件,可以通过下载按钮或使用 ZIP 压缩包下载。',
|
|
52
|
-
},
|
|
53
|
-
];
|
|
54
|
-
|
|
55
|
-
const seo: GifAJpgLocaleContent['seo'] = [
|
|
56
|
-
{
|
|
57
|
-
type: 'title',
|
|
58
|
-
text: 'GIF 转 JPG 转换器:将帧提取为高质量图像',
|
|
59
|
-
level: 2,
|
|
60
|
-
},
|
|
61
|
-
{
|
|
62
|
-
type: 'paragraph',
|
|
63
|
-
html: '几十年来,GIF 文件一直主导着互联网上的短动画世界。然而,它们的动画特性使其在作为缩略图、社交网络预览或文档图像时完全无用。当您需要从 GIF 中提取特定帧并将其转换为高质量的静态图像时,转换为 JPG 是最实用且最具兼容性的解决方案。',
|
|
64
|
-
},
|
|
65
|
-
{
|
|
66
|
-
type: 'title',
|
|
67
|
-
text: 'GIF 还是 JPG?用途截然相反的格式',
|
|
68
|
-
level: 3,
|
|
69
|
-
},
|
|
70
|
-
{
|
|
71
|
-
type: 'paragraph',
|
|
72
|
-
html: 'GIF(图形交换格式)设计于 1987 年,存在一个沿用至今的严重限制:每帧只能表现 256 种颜色。这种技术限制对于调色板有限的简单动画并不重要,但对于真实的照片拍摄来说,它变成了一种视觉上贫乏的格式。相比之下,JPG 可以通过先进的感知压缩算法呈现数千万种颜色。',
|
|
73
|
-
},
|
|
74
|
-
{
|
|
75
|
-
type: 'paragraph',
|
|
76
|
-
html: '从 GIF 中提取一帧并将其保存为 JPG 有多种应用:为视频播放器生成缩略图,为内容管理平台创建预览,获取演示文稿的静态图像,或者仅仅是归档复杂动画中的某个视觉时刻。生成的 JPG 将比原始 GIF 轻得多,且具有普适的兼容性。',
|
|
77
|
-
},
|
|
78
|
-
{
|
|
79
|
-
type: 'title',
|
|
80
|
-
text: '架构对比:本地 vs 云端',
|
|
81
|
-
level: 3,
|
|
82
|
-
},
|
|
83
|
-
{
|
|
84
|
-
type: 'comparative',
|
|
85
|
-
items: [
|
|
86
|
-
{
|
|
87
|
-
title: '云端转换器',
|
|
88
|
-
description: '将文件上传到远程服务器进行处理的工具。',
|
|
89
|
-
icon: 'mdi:cloud-upload',
|
|
90
|
-
pointIcon: 'mdi:close-circle-outline',
|
|
91
|
-
points: [
|
|
92
|
-
'您的 GIF 通过互联网传输到第三方服务器',
|
|
93
|
-
'上传和下载过程中存在网络延迟',
|
|
94
|
-
'单次会话存在文件体积和数量限制',
|
|
95
|
-
'数据在他人服务器上留存的风险',
|
|
96
|
-
],
|
|
97
|
-
},
|
|
98
|
-
{
|
|
99
|
-
title: '我们的本地架构',
|
|
100
|
-
description: '通过 Vanilla JS 技术在您的硬件上直接处理。',
|
|
101
|
-
icon: 'mdi:laptop-mac',
|
|
102
|
-
highlight: true,
|
|
103
|
-
points: [
|
|
104
|
-
'GIF 绝不离开您的设备',
|
|
105
|
-
'无需网络等待,实现即时速度',
|
|
106
|
-
'没有体积或文件数量限制',
|
|
107
|
-
'完全隐私:0 字节向外传输',
|
|
108
|
-
],
|
|
109
|
-
},
|
|
110
|
-
],
|
|
111
|
-
},
|
|
112
|
-
{
|
|
113
|
-
type: 'title',
|
|
114
|
-
text: '第一帧提取的技术原理',
|
|
115
|
-
level: 3,
|
|
116
|
-
},
|
|
117
|
-
{
|
|
118
|
-
type: 'paragraph',
|
|
119
|
-
html: '本地转换依托于 HTML5 Canvas API 的性能。当您加载 GIF 时,浏览器将其作为原生 Image 元素在内存中解码。通过在不可见画布(canvas)上渲染,浏览器的图形引擎会自动捕捉动画序列的第一帧。',
|
|
120
|
-
},
|
|
121
|
-
{
|
|
122
|
-
type: 'paragraph',
|
|
123
|
-
html: '由于 JPG 格式不支持透明度,我们的算法在导出前会应用纯白色固态背景。画布的 <code>toDataURL(\'image/jpeg\')</code> 方法直接在您电脑的 RAM 中生成 JPG 字节流,无需任何网络连接。生成的文件会立即下载到您的设备。',
|
|
124
|
-
},
|
|
125
|
-
{
|
|
126
|
-
type: 'tip',
|
|
127
|
-
title: 'GIF 有限的调色板',
|
|
128
|
-
html: 'GIF 每帧只能包含 256 种颜色。提取出的 JPG 将继承原图极其有限的调色板:如果 GIF 中有渐变或照片,可能会出现色彩断层(Posterization)。为了获得最佳效果,请使用颜色简单的 GIF 或插图。',
|
|
129
|
-
},
|
|
130
|
-
{
|
|
131
|
-
type: 'title',
|
|
132
|
-
text: '生成 JPG 的应用场景与兼容性',
|
|
133
|
-
level: 3,
|
|
134
|
-
},
|
|
135
|
-
{
|
|
136
|
-
type: 'list',
|
|
137
|
-
icon: 'mdi:check-circle',
|
|
138
|
-
items: [
|
|
139
|
-
'视频平台和 CMS 的缩略图及预览图。',
|
|
140
|
-
'社交网络发布的封面图。',
|
|
141
|
-
'插入 Word、PowerPoint 或 PDF 文档。',
|
|
142
|
-
'演示文件和营销材料。',
|
|
143
|
-
'与 Windows、macOS 及移动端查看器全平台兼容。',
|
|
144
|
-
],
|
|
145
|
-
},
|
|
146
|
-
{
|
|
147
|
-
type: 'title',
|
|
148
|
-
text: '结论:那一帧比整段动画更有价值',
|
|
149
|
-
level: 3,
|
|
150
|
-
},
|
|
151
|
-
{
|
|
152
|
-
type: 'paragraph',
|
|
153
|
-
html: '一个 2 MB 的动画 GIF 可能会根据分辨率生成一个仅约 50-200 KB 的第一帧 JPG。我们的工具直接在您的浏览器中即时、私密且无限制地完成此项转换。无需服务器,无需账号,无需等待。',
|
|
154
|
-
},
|
|
155
|
-
];
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
export const content: GifAJpgLocaleContent = {
|
|
159
|
-
slug,
|
|
160
|
-
title,
|
|
161
|
-
description,
|
|
162
|
-
ui,
|
|
163
|
-
seo,
|
|
164
|
-
faq,
|
|
165
|
-
bibliography,
|
|
166
|
-
howTo,
|
|
167
|
-
schemas: generateSchemas({ title, description, inLanguage: 'zh', faq, howTo }),
|
|
168
|
-
};
|
|
18
|
+
bibliographyTitle: '参考文献',
|
|
19
|
+
faqTitle: '常见问题',
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
const faq: GifAJpgLocaleContent['faq'] = [
|
|
23
|
+
{
|
|
24
|
+
question: '当我转换为 JPG 时,动画会发生什么?',
|
|
25
|
+
answer:
|
|
26
|
+
'JPG 格式严格来说是静态的,不支持多帧。我们的转换器仅提取 GIF 序列中出现的第一张图像或第一帧。',
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
question: '我会丢失任何特殊效果或透明背景吗?',
|
|
30
|
+
answer:
|
|
31
|
+
'是的,这是 JPG 标准的自然特性。如果您上传带有透明背景的 GIF,我们会自动在下方插入一个纯白色固态层,以避免颜色损坏。',
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
question: '我可以在网站不保存我的内容的情况下从 GIF 中提取 JPG 图片吗?',
|
|
35
|
+
answer:
|
|
36
|
+
'当然可以。该工具是基于 HTML5 Canvas 的 Web App。所有解码工作均由您自己的物理设备的处理器执行。',
|
|
37
|
+
},
|
|
38
|
+
];
|
|
39
|
+
|
|
40
|
+
const howTo: GifAJpgLocaleContent['howTo'] = [
|
|
41
|
+
{
|
|
42
|
+
name: '拖拽可移动的重型文件',
|
|
43
|
+
text: '将文件夹中的那个 GIF 拖拽到我们的处理框中。',
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
name: '干净的第一帧提取计算',
|
|
47
|
+
text: '在极短的时间内提取动画,生成纯白色背景的 JPG,无需接触服务器。',
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
name: '获取 ZIP 批量包',
|
|
51
|
+
text: '如果您处理了大量文件,可以通过下载按钮或使用 ZIP 压缩包下载。',
|
|
52
|
+
},
|
|
53
|
+
];
|
|
54
|
+
|
|
55
|
+
const seo: GifAJpgLocaleContent['seo'] = [
|
|
56
|
+
{
|
|
57
|
+
type: 'title',
|
|
58
|
+
text: 'GIF 转 JPG 转换器:将帧提取为高质量图像',
|
|
59
|
+
level: 2,
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
type: 'paragraph',
|
|
63
|
+
html: '几十年来,GIF 文件一直主导着互联网上的短动画世界。然而,它们的动画特性使其在作为缩略图、社交网络预览或文档图像时完全无用。当您需要从 GIF 中提取特定帧并将其转换为高质量的静态图像时,转换为 JPG 是最实用且最具兼容性的解决方案。',
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
type: 'title',
|
|
67
|
+
text: 'GIF 还是 JPG?用途截然相反的格式',
|
|
68
|
+
level: 3,
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
type: 'paragraph',
|
|
72
|
+
html: 'GIF(图形交换格式)设计于 1987 年,存在一个沿用至今的严重限制:每帧只能表现 256 种颜色。这种技术限制对于调色板有限的简单动画并不重要,但对于真实的照片拍摄来说,它变成了一种视觉上贫乏的格式。相比之下,JPG 可以通过先进的感知压缩算法呈现数千万种颜色。',
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
type: 'paragraph',
|
|
76
|
+
html: '从 GIF 中提取一帧并将其保存为 JPG 有多种应用:为视频播放器生成缩略图,为内容管理平台创建预览,获取演示文稿的静态图像,或者仅仅是归档复杂动画中的某个视觉时刻。生成的 JPG 将比原始 GIF 轻得多,且具有普适的兼容性。',
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
type: 'title',
|
|
80
|
+
text: '架构对比:本地 vs 云端',
|
|
81
|
+
level: 3,
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
type: 'comparative',
|
|
85
|
+
items: [
|
|
86
|
+
{
|
|
87
|
+
title: '云端转换器',
|
|
88
|
+
description: '将文件上传到远程服务器进行处理的工具。',
|
|
89
|
+
icon: 'mdi:cloud-upload',
|
|
90
|
+
pointIcon: 'mdi:close-circle-outline',
|
|
91
|
+
points: [
|
|
92
|
+
'您的 GIF 通过互联网传输到第三方服务器',
|
|
93
|
+
'上传和下载过程中存在网络延迟',
|
|
94
|
+
'单次会话存在文件体积和数量限制',
|
|
95
|
+
'数据在他人服务器上留存的风险',
|
|
96
|
+
],
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
title: '我们的本地架构',
|
|
100
|
+
description: '通过 Vanilla JS 技术在您的硬件上直接处理。',
|
|
101
|
+
icon: 'mdi:laptop-mac',
|
|
102
|
+
highlight: true,
|
|
103
|
+
points: [
|
|
104
|
+
'GIF 绝不离开您的设备',
|
|
105
|
+
'无需网络等待,实现即时速度',
|
|
106
|
+
'没有体积或文件数量限制',
|
|
107
|
+
'完全隐私:0 字节向外传输',
|
|
108
|
+
],
|
|
109
|
+
},
|
|
110
|
+
],
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
type: 'title',
|
|
114
|
+
text: '第一帧提取的技术原理',
|
|
115
|
+
level: 3,
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
type: 'paragraph',
|
|
119
|
+
html: '本地转换依托于 HTML5 Canvas API 的性能。当您加载 GIF 时,浏览器将其作为原生 Image 元素在内存中解码。通过在不可见画布(canvas)上渲染,浏览器的图形引擎会自动捕捉动画序列的第一帧。',
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
type: 'paragraph',
|
|
123
|
+
html: '由于 JPG 格式不支持透明度,我们的算法在导出前会应用纯白色固态背景。画布的 <code>toDataURL(\'image/jpeg\')</code> 方法直接在您电脑的 RAM 中生成 JPG 字节流,无需任何网络连接。生成的文件会立即下载到您的设备。',
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
type: 'tip',
|
|
127
|
+
title: 'GIF 有限的调色板',
|
|
128
|
+
html: 'GIF 每帧只能包含 256 种颜色。提取出的 JPG 将继承原图极其有限的调色板:如果 GIF 中有渐变或照片,可能会出现色彩断层(Posterization)。为了获得最佳效果,请使用颜色简单的 GIF 或插图。',
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
type: 'title',
|
|
132
|
+
text: '生成 JPG 的应用场景与兼容性',
|
|
133
|
+
level: 3,
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
type: 'list',
|
|
137
|
+
icon: 'mdi:check-circle',
|
|
138
|
+
items: [
|
|
139
|
+
'视频平台和 CMS 的缩略图及预览图。',
|
|
140
|
+
'社交网络发布的封面图。',
|
|
141
|
+
'插入 Word、PowerPoint 或 PDF 文档。',
|
|
142
|
+
'演示文件和营销材料。',
|
|
143
|
+
'与 Windows、macOS 及移动端查看器全平台兼容。',
|
|
144
|
+
],
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
type: 'title',
|
|
148
|
+
text: '结论:那一帧比整段动画更有价值',
|
|
149
|
+
level: 3,
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
type: 'paragraph',
|
|
153
|
+
html: '一个 2 MB 的动画 GIF 可能会根据分辨率生成一个仅约 50-200 KB 的第一帧 JPG。我们的工具直接在您的浏览器中即时、私密且无限制地完成此项转换。无需服务器,无需账号,无需等待。',
|
|
154
|
+
},
|
|
155
|
+
];
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
export const content: GifAJpgLocaleContent = {
|
|
159
|
+
slug,
|
|
160
|
+
title,
|
|
161
|
+
description,
|
|
162
|
+
ui,
|
|
163
|
+
seo,
|
|
164
|
+
faq,
|
|
165
|
+
bibliography,
|
|
166
|
+
howTo,
|
|
167
|
+
schemas: generateSchemas({ title, description, inLanguage: 'zh', faq, howTo }),
|
|
168
|
+
};
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
---
|
|
2
|
-
import { SEORenderer } from '@jjlmoya/utils-shared';
|
|
3
|
-
import { gifAJpg } from './index';
|
|
4
|
-
import type { KnownLocale } from '../../types';
|
|
5
|
-
|
|
6
|
-
interface Props {
|
|
7
|
-
locale?: KnownLocale;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
const { locale = 'es' } = Astro.props;
|
|
11
|
-
const content = await gifAJpg.i18n[locale]?.();
|
|
12
|
-
if (!content) return null;
|
|
13
|
-
---
|
|
14
|
-
|
|
15
|
-
{content.seo?.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}
|
|
1
|
+
---
|
|
2
|
+
import { SEORenderer } from '@jjlmoya/utils-shared';
|
|
3
|
+
import { gifAJpg } from './index';
|
|
4
|
+
import type { KnownLocale } from '../../types';
|
|
5
|
+
|
|
6
|
+
interface Props {
|
|
7
|
+
locale?: KnownLocale;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const { locale = 'es' } = Astro.props;
|
|
11
|
+
const content = await gifAJpg.i18n[locale]?.();
|
|
12
|
+
if (!content) return null;
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
{content.seo?.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}
|