imageConverter.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. /**
  2. * 图片转换工具
  3. * 提供将PNG/JPG图片转换为ICO格式的工具函数
  4. */
  5. /**
  6. * 将BASE64图片数据转换为ICO格式
  7. * @param {String} base64Data - BASE64编码的图片数据
  8. * @param {Number} size - 图标尺寸(默认32)
  9. * @returns {Promise<String>} - 返回BASE64编码的ICO数据
  10. */
  11. export function convertToIco(base64Data, size = 32) {
  12. // #ifdef H5
  13. return new Promise((resolve, reject) => {
  14. try {
  15. const image = new Image();
  16. image.onload = function() {
  17. const canvas = document.createElement('canvas');
  18. canvas.width = size;
  19. canvas.height = size;
  20. const ctx = canvas.getContext('2d');
  21. ctx.drawImage(image, 0, 0, size, size);
  22. // 获取ICO格式的BASE64数据
  23. // 注: 这只是模拟的, 实际上Canvas无法直接导出ICO格式
  24. // 在实际应用中, 应该使用Node.js后端或第三方服务进行转换
  25. const pngBase64 = canvas.toDataURL('image/png');
  26. console.log('图像已转换为PNG格式, 需要服务端转换为ICO');
  27. resolve(pngBase64);
  28. };
  29. image.onerror = function() {
  30. reject(new Error('图片加载失败'));
  31. };
  32. image.src = base64Data;
  33. } catch (error) {
  34. reject(error);
  35. }
  36. });
  37. // #endif
  38. // 非H5环境
  39. // #ifndef H5
  40. return Promise.reject(new Error('当前环境不支持图片转换'));
  41. // #endif
  42. }
  43. /**
  44. * 将图片文件转换为ICO文件
  45. * @param {File} file - 图片文件
  46. * @param {Number} size - 图标尺寸(默认32)
  47. * @returns {Promise<Blob>} - 返回ICO格式的Blob数据
  48. */
  49. export function convertFileToIco(file, size = 32) {
  50. // #ifdef H5
  51. return new Promise((resolve, reject) => {
  52. try {
  53. const reader = new FileReader();
  54. reader.onload = function(e) {
  55. convertToIco(e.target.result, size)
  56. .then(base64Data => {
  57. // 将BASE64转换为Blob
  58. const byteString = atob(base64Data.split(',')[1]);
  59. const mimeString = base64Data.split(',')[0].split(':')[1].split(';')[0];
  60. const ab = new ArrayBuffer(byteString.length);
  61. const ia = new Uint8Array(ab);
  62. for (let i = 0; i < byteString.length; i++) {
  63. ia[i] = byteString.charCodeAt(i);
  64. }
  65. const blob = new Blob([ab], {type: mimeString});
  66. resolve(blob);
  67. })
  68. .catch(reject);
  69. };
  70. reader.onerror = function() {
  71. reject(new Error('文件读取失败'));
  72. };
  73. reader.readAsDataURL(file);
  74. } catch (error) {
  75. reject(error);
  76. }
  77. });
  78. // #endif
  79. // 非H5环境
  80. // #ifndef H5
  81. return Promise.reject(new Error('当前环境不支持图片转换'));
  82. // #endif
  83. }
  84. /**
  85. * 显示如何在Windows系统上转换ICO的提示信息
  86. * @returns {String} 转换提示信息
  87. */
  88. export function getIconConversionGuide() {
  89. return `
  90. 将图片转换为ICO格式的方法:
  91. 1. 在线转换工具:
  92. - 访问 https://www.favicon-generator.org/ 或 https://convertio.co/zh/png-ico/
  93. - 上传您的图片(建议是正方形图片)
  94. - 下载转换后的ICO文件
  95. 2. 使用Windows自带工具:
  96. - 打开画图(Paint)程序
  97. - 打开您的图片并调整大小为32x32或16x16像素
  98. - 另存为BMP格式
  99. - 使用图标编辑器转换为ICO(可使用Resource Hacker等工具)
  100. 3. 使用专业软件:
  101. - Adobe Photoshop配合ICO插件
  102. - GIMP等开源图像处理软件
  103. 推荐图标尺寸:
  104. - 16x16: 浏览器标签页
  105. - 32x32: Windows文件浏览器
  106. - 48x48: Windows任务栏
  107. `;
  108. }
  109. export default {
  110. convertToIco,
  111. convertFileToIco,
  112. getIconConversionGuide
  113. }