@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.
Files changed (133) hide show
  1. package/package.json +2 -2
  2. package/src/category/i18n/de.ts +1 -1
  3. package/src/category/i18n/en.ts +1 -1
  4. package/src/category/i18n/fr.ts +1 -1
  5. package/src/category/i18n/id.ts +1 -1
  6. package/src/category/i18n/it.ts +1 -1
  7. package/src/category/i18n/nl.ts +1 -1
  8. package/src/category/i18n/pl.ts +1 -1
  9. package/src/category/i18n/pt.ts +1 -1
  10. package/src/category/i18n/sv.ts +1 -1
  11. package/src/tests/bibliography_wellformed_export.test.ts +46 -0
  12. package/src/tests/category_seo_quality.test.ts +74 -0
  13. package/src/tests/faq_count.test.ts +1 -1
  14. package/src/tests/no_h1_in_components.test.ts +1 -1
  15. package/src/tests/seo_parity.test.ts +2 -2
  16. package/src/tests/seo_wellformed_export.test.ts +65 -0
  17. package/src/tests/tool_validation.test.ts +15 -15
  18. package/src/tool/avifAJpg/i18n/en.ts +164 -164
  19. package/src/tool/avifAJpg/i18n/es.ts +164 -164
  20. package/src/tool/avifAJpg/i18n/fr.ts +164 -164
  21. package/src/tool/avifAJpg/i18n/ja.ts +166 -166
  22. package/src/tool/avifAJpg/i18n/ko.ts +166 -166
  23. package/src/tool/avifAJpg/i18n/zh.ts +166 -166
  24. package/src/tool/avifAJpg/seo.astro +15 -15
  25. package/src/tool/avifAPng/i18n/en.ts +164 -164
  26. package/src/tool/avifAPng/i18n/es.ts +164 -164
  27. package/src/tool/avifAPng/i18n/fr.ts +164 -164
  28. package/src/tool/avifAPng/i18n/ja.ts +166 -166
  29. package/src/tool/avifAPng/i18n/ko.ts +166 -166
  30. package/src/tool/avifAPng/i18n/zh.ts +166 -166
  31. package/src/tool/avifAPng/seo.astro +15 -15
  32. package/src/tool/avifAWebp/i18n/en.ts +164 -164
  33. package/src/tool/avifAWebp/i18n/es.ts +164 -164
  34. package/src/tool/avifAWebp/i18n/fr.ts +164 -164
  35. package/src/tool/avifAWebp/i18n/ja.ts +166 -166
  36. package/src/tool/avifAWebp/i18n/ko.ts +166 -166
  37. package/src/tool/avifAWebp/i18n/zh.ts +166 -166
  38. package/src/tool/avifAWebp/seo.astro +15 -15
  39. package/src/tool/bmpAJpg/i18n/en.ts +164 -164
  40. package/src/tool/bmpAJpg/i18n/es.ts +164 -164
  41. package/src/tool/bmpAJpg/i18n/fr.ts +164 -164
  42. package/src/tool/bmpAJpg/i18n/ja.ts +166 -166
  43. package/src/tool/bmpAJpg/i18n/ko.ts +166 -166
  44. package/src/tool/bmpAJpg/i18n/zh.ts +166 -166
  45. package/src/tool/bmpAJpg/seo.astro +15 -15
  46. package/src/tool/bmpAPng/i18n/en.ts +164 -164
  47. package/src/tool/bmpAPng/i18n/es.ts +164 -164
  48. package/src/tool/bmpAPng/i18n/fr.ts +164 -164
  49. package/src/tool/bmpAPng/i18n/ja.ts +165 -165
  50. package/src/tool/bmpAPng/i18n/ko.ts +165 -165
  51. package/src/tool/bmpAPng/i18n/zh.ts +165 -165
  52. package/src/tool/bmpAPng/seo.astro +15 -15
  53. package/src/tool/bmpAWebp/i18n/en.ts +164 -164
  54. package/src/tool/bmpAWebp/i18n/es.ts +164 -164
  55. package/src/tool/bmpAWebp/i18n/fr.ts +164 -164
  56. package/src/tool/bmpAWebp/i18n/ja.ts +166 -166
  57. package/src/tool/bmpAWebp/i18n/ko.ts +166 -166
  58. package/src/tool/bmpAWebp/i18n/zh.ts +166 -166
  59. package/src/tool/bmpAWebp/seo.astro +15 -15
  60. package/src/tool/gifAJpg/i18n/en.ts +164 -164
  61. package/src/tool/gifAJpg/i18n/es.ts +164 -164
  62. package/src/tool/gifAJpg/i18n/fr.ts +164 -164
  63. package/src/tool/gifAJpg/i18n/ja.ts +166 -166
  64. package/src/tool/gifAJpg/i18n/ko.ts +166 -166
  65. package/src/tool/gifAJpg/i18n/zh.ts +166 -166
  66. package/src/tool/gifAJpg/seo.astro +15 -15
  67. package/src/tool/gifAPng/i18n/en.ts +164 -164
  68. package/src/tool/gifAPng/i18n/es.ts +164 -164
  69. package/src/tool/gifAPng/i18n/fr.ts +164 -164
  70. package/src/tool/gifAPng/i18n/ja.ts +166 -166
  71. package/src/tool/gifAPng/i18n/ko.ts +166 -166
  72. package/src/tool/gifAPng/i18n/zh.ts +166 -166
  73. package/src/tool/gifAPng/seo.astro +15 -15
  74. package/src/tool/gifAWebp/i18n/en.ts +164 -164
  75. package/src/tool/gifAWebp/i18n/es.ts +164 -164
  76. package/src/tool/gifAWebp/i18n/fr.ts +164 -164
  77. package/src/tool/gifAWebp/i18n/ja.ts +166 -166
  78. package/src/tool/gifAWebp/i18n/ko.ts +166 -166
  79. package/src/tool/gifAWebp/i18n/zh.ts +166 -166
  80. package/src/tool/gifAWebp/seo.astro +15 -15
  81. package/src/tool/imagenBase64/i18n/en.ts +154 -154
  82. package/src/tool/imagenBase64/i18n/es.ts +154 -154
  83. package/src/tool/imagenBase64/i18n/fr.ts +154 -154
  84. package/src/tool/imagenBase64/seo.astro +15 -15
  85. package/src/tool/jpgAIco/seo.astro +15 -15
  86. package/src/tool/jpgAPng/i18n/en.ts +164 -164
  87. package/src/tool/jpgAPng/i18n/es.ts +164 -164
  88. package/src/tool/jpgAPng/i18n/fr.ts +164 -164
  89. package/src/tool/jpgAPng/i18n/ja.ts +166 -166
  90. package/src/tool/jpgAPng/i18n/ko.ts +166 -166
  91. package/src/tool/jpgAPng/i18n/zh.ts +166 -166
  92. package/src/tool/jpgAPng/seo.astro +15 -15
  93. package/src/tool/jpgAWebp/i18n/en.ts +164 -164
  94. package/src/tool/jpgAWebp/i18n/es.ts +164 -164
  95. package/src/tool/jpgAWebp/i18n/fr.ts +164 -164
  96. package/src/tool/jpgAWebp/seo.astro +15 -15
  97. package/src/tool/pngAIco/seo.astro +15 -15
  98. package/src/tool/pngAJpg/i18n/de.ts +21 -21
  99. package/src/tool/pngAJpg/i18n/es.ts +177 -177
  100. package/src/tool/pngAJpg/i18n/fr.ts +137 -137
  101. package/src/tool/pngAJpg/i18n/id.ts +89 -89
  102. package/src/tool/pngAJpg/i18n/it.ts +89 -89
  103. package/src/tool/pngAJpg/i18n/ko.ts +177 -177
  104. package/src/tool/pngAJpg/i18n/nl.ts +20 -20
  105. package/src/tool/pngAJpg/i18n/pl.ts +89 -89
  106. package/src/tool/pngAJpg/i18n/pt.ts +89 -89
  107. package/src/tool/pngAJpg/i18n/ru.ts +177 -177
  108. package/src/tool/pngAJpg/i18n/sv.ts +89 -89
  109. package/src/tool/pngAJpg/i18n/tr.ts +89 -89
  110. package/src/tool/pngAJpg/seo.astro +15 -15
  111. package/src/tool/pngAWebp/i18n/en.ts +164 -164
  112. package/src/tool/pngAWebp/i18n/es.ts +164 -164
  113. package/src/tool/pngAWebp/i18n/fr.ts +164 -164
  114. package/src/tool/pngAWebp/seo.astro +15 -15
  115. package/src/tool/svgAJpg/i18n/fr.ts +164 -164
  116. package/src/tool/svgAJpg/seo.astro +15 -15
  117. package/src/tool/svgAPng/i18n/fr.ts +164 -164
  118. package/src/tool/svgAPng/seo.astro +15 -15
  119. package/src/tool/webpAIco/seo.astro +15 -15
  120. package/src/tool/webpAJpg/seo.astro +15 -15
  121. package/src/tool/webpAPng/bibliography.ts +13 -13
  122. package/src/tool/webpAPng/i18n/de.ts +166 -166
  123. package/src/tool/webpAPng/i18n/es.ts +171 -171
  124. package/src/tool/webpAPng/i18n/fr.ts +166 -166
  125. package/src/tool/webpAPng/i18n/id.ts +166 -166
  126. package/src/tool/webpAPng/i18n/it.ts +166 -166
  127. package/src/tool/webpAPng/i18n/nl.ts +166 -166
  128. package/src/tool/webpAPng/i18n/pl.ts +166 -166
  129. package/src/tool/webpAPng/i18n/pt.ts +166 -166
  130. package/src/tool/webpAPng/i18n/ru.ts +166 -166
  131. package/src/tool/webpAPng/i18n/sv.ts +166 -166
  132. package/src/tool/webpAPng/i18n/tr.ts +167 -167
  133. 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 기술을 기반으로 한 웹 앱입니다. 모든 디코딩 작업은 사용자의 기기 내 프로세서에 의해 직접 수행됩니다.',
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 to JPG 변환기: 애니메이션 프레임을 고품질 정지 이미지로 추출',
59
- level: 2,
60
- },
61
- {
62
- type: 'paragraph',
63
- html: 'GIF 파일은 수십 년 동안 인터넷의 짧은 애니메이션 문화를 주도해 왔습니다. 하지만 애니메이션 형태는 썸네일, SNS 미리보기, 문서 삽입용 이미지로 활용하기에는 부적합한 경우가 많습니다. 특정 프레임을 고품질 정지 이미지로 추출해야 할 때 JPG 변환은 가장 실용적이고 호환성이 뛰어난 해결책입니다.',
64
- },
65
- {
66
- type: 'title',
67
- text: 'GIF 또는 JPG? 상반된 목적을 가진 두 형식',
68
- level: 3,
69
- },
70
- {
71
- type: 'paragraph',
72
- html: 'GIF(Graphics Interchange Format)는 프레임당 256색만 표현할 수 있다는 기술적 한계를 안고 1987년에 설계되었습니다. 간단한 그래픽에는 문제가 없었으나 정밀한 사진 표현에는 적합하지 않았습니다. 반면 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
- '사용자의 이미지가 인터넷망을 통해 외부 서버로 전송됨',
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 데이터로 디코딩합니다. 보이지 않는 캔버스 위에서 렌더링이 이루어지며, 브라우저 엔진은 애니메이션 시퀀스의 첫 번째 프레임을 자동으로 캡처합니다.',
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의 경우 약간의 색 끊김 현상이 보일 수 있습니다. 최상의 결과를 위해 단순한 색상의 그래픽 이미지를 사용하시기 바랍니다.',
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
- '워드, 파워포인트, PDF 등 문서 삽입용 이미지.',
142
- '발표용 파일 및 마케팅 기획안 자료 구축.',
143
- '윈도우, 맥, 모바일 등 모든 환경의 이미지 뷰어와 완벽 호환.',
144
- ],
145
- },
146
- {
147
- type: 'title',
148
- text: '결론: 애니메이션 전체보다 가치 있는 결정적 한 장면',
149
- level: 3,
150
- },
151
- {
152
- type: 'paragraph',
153
- html: '2MB 용량의 GIF 애니메이션에서 약 50~200KB 수준의 가벼운 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: 'ko', 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 기술을 기반으로 한 웹 앱입니다. 모든 디코딩 작업은 사용자의 기기 내 프로세서에 의해 직접 수행됩니다.',
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 to JPG 변환기: 애니메이션 프레임을 고품질 정지 이미지로 추출',
59
+ level: 2,
60
+ },
61
+ {
62
+ type: 'paragraph',
63
+ html: 'GIF 파일은 수십 년 동안 인터넷의 짧은 애니메이션 문화를 주도해 왔습니다. 하지만 애니메이션 형태는 썸네일, SNS 미리보기, 문서 삽입용 이미지로 활용하기에는 부적합한 경우가 많습니다. 특정 프레임을 고품질 정지 이미지로 추출해야 할 때 JPG 변환은 가장 실용적이고 호환성이 뛰어난 해결책입니다.',
64
+ },
65
+ {
66
+ type: 'title',
67
+ text: 'GIF 또는 JPG? 상반된 목적을 가진 두 형식',
68
+ level: 3,
69
+ },
70
+ {
71
+ type: 'paragraph',
72
+ html: 'GIF(Graphics Interchange Format)는 프레임당 256색만 표현할 수 있다는 기술적 한계를 안고 1987년에 설계되었습니다. 간단한 그래픽에는 문제가 없었으나 정밀한 사진 표현에는 적합하지 않았습니다. 반면 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
+ '사용자의 이미지가 인터넷망을 통해 외부 서버로 전송됨',
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 데이터로 디코딩합니다. 보이지 않는 캔버스 위에서 렌더링이 이루어지며, 브라우저 엔진은 애니메이션 시퀀스의 첫 번째 프레임을 자동으로 캡처합니다.',
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의 경우 약간의 색 끊김 현상이 보일 수 있습니다. 최상의 결과를 위해 단순한 색상의 그래픽 이미지를 사용하시기 바랍니다.',
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
+ '워드, 파워포인트, PDF 등 문서 삽입용 이미지.',
142
+ '발표용 파일 및 마케팅 기획안 자료 구축.',
143
+ '윈도우, 맥, 모바일 등 모든 환경의 이미지 뷰어와 완벽 호환.',
144
+ ],
145
+ },
146
+ {
147
+ type: 'title',
148
+ text: '결론: 애니메이션 전체보다 가치 있는 결정적 한 장면',
149
+ level: 3,
150
+ },
151
+ {
152
+ type: 'paragraph',
153
+ html: '2MB 용량의 GIF 애니메이션에서 약 50~200KB 수준의 가벼운 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: 'ko', faq, howTo }),
168
+ };