fileHandler.ts 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. // 将 File 对象转为 buffer
  2. function convertFileToBuffer(file: File) {
  3. return new Promise((resolve, reject) => {
  4. const fileReader = new FileReader()
  5. fileReader.onload = () => {
  6. const uint8Array = new Uint8Array(fileReader.result as ArrayBuffer)
  7. resolve(uint8Array)
  8. }
  9. fileReader.onerror = () => {
  10. reject(fileReader.error)
  11. }
  12. fileReader.readAsArrayBuffer(file)
  13. })
  14. }
  15. // 将 base64 转为字节码
  16. function convertBase64ToBytes(imageBase64: string): Uint8Array {
  17. const dataUrl = imageBase64.split(';base64,')[1]
  18. const imageData = atob(dataUrl)
  19. const bytes = new Uint8Array(imageData.length)
  20. for (let i = 0; i < imageData.length; i++) {
  21. bytes[i] = imageData.charCodeAt(i)
  22. }
  23. return bytes
  24. }
  25. // 根据 base64 获取图片的格式
  26. function getImageFormateFromBase64(imageBase64: string): string {
  27. const dataArray = imageBase64.split(';base64,')
  28. if (dataArray.length !== 2) {
  29. throw new Error('Invalid base64 image')
  30. }
  31. const mimeType = dataArray[0].split(':')[1]
  32. return mimeType.split('/')[1]
  33. }
  34. function convertbase64ToJpgBuffer(imageBase64: string, width: number, height: number): Promise<Uint8Array> {
  35. return new Promise((resolve, reject) => {
  36. const mimeType = getImageFormateFromBase64(imageBase64)
  37. if (mimeType === 'jpeg' || mimeType === 'jpg') {
  38. const bytes = convertBase64ToBytes(imageBase64)
  39. resolve(bytes)
  40. return
  41. }
  42. const image = new Image()
  43. image.src = imageBase64
  44. image.onload = () => {
  45. const width = image.width
  46. const height = image.height
  47. const canvas = document.createElement('canvas')
  48. canvas.width = width
  49. canvas.height = height
  50. const ctx = canvas.getContext('2d')
  51. if (!ctx) {
  52. reject(new Error('Invalid canvas context'))
  53. return
  54. }
  55. ctx.drawImage(image, 0, 0, width, height)
  56. const jpgBuffer = canvas.toDataURL('image/jpeg')
  57. const bytes = convertBase64ToBytes(jpgBuffer)
  58. resolve(bytes)
  59. }
  60. })
  61. }
  62. export {
  63. convertFileToBuffer,
  64. convertbase64ToJpgBuffer
  65. }