ImageStore.addImageFromBase64 的替代方案?

Alternative for ImageStore.addImageFromBase64?

在更新旧的 React Native 应用程序时,我 运行 遇到了遗留代码的问题。它在一种方法中使用 ImageStore addImageFromBase64() 来:

  1. 将Base64图片存入FS
  2. 在顶部和底部添加白色 space(通过调整大小)
  3. 再次从 FS 中以 Base64 格式检索它

我应该如何修改它以实现相同的所需功能?

问题是 addImageFromBase64() 在 Android 上不起作用。

Warning: react-native: ImageStore.addImageFromBase64() is not implemented on android

  // Resize photo (fill white space on top and bottom)
  static async addWhiteSpace(data) {
    const {
      height,
      width,
      base64Str
    } = data;
    const cropData = {
      offset: {
        x: 0,
        y: - height / 2,
      },
      size: {
        width,
        height: 2 * height
      },
      resizeMode: 'contain'
    };

    const uriResolver = await new Promise((resolve, reject) => {
      ImageStore.addImageFromBase64(base64Str, (uri) => {
        resolve(uri)
      }, (err) => {
        reject(err)
      })
    });
    const whitespaceURIResolver = await new Promise((resolve, reject) => {
      ImageEditor.cropImage(uriResolver, cropData, (whitespaceURI) => {
        resolve(whitespaceURI)
      }, (err) => {
        reject(err)
      })
    });
    const base64Resolver = await new Promise((resolve, reject) => {
      ImageStore.getBase64ForTag(whitespaceURIResolver, (base64) => {
        resolve(base64)
      }, (err) => {
        reject(err)
      })
    });
    return base64Resolver
  }

我没有这样做,但您可以通过在 base64 数据前加上 data:image/png;base64, 前缀,直接将图像加载到图像编辑器中。
在您的情况下,调用可能如下所示:

    ImageEditor.cropImage('data:image/png;base64,'+base64Str, cropData, (whitespaceURI) => etc..

这解决了问题,现在 Android 和 iOS 上都是 运行:

  static async addWhiteSpace(data) {
    const {
      height,
      width,
      base64Str
    } = data;
    const cropData = {
      offset: {
        x: 0,
        y: Math.abs(- height / 2),
      },
      size: {
        width,
        height: 2 * height
      },
      resizeMode: 'contain'
    };

    const uriResolver = await RNFS.writeFile(RNFS.CachesDirectoryPath + "temp.png", base64Str, 'base64');
    const whitespaceURIResolver = await new Promise((resolve, reject) => {
      ImageEditor.cropImage("file:" + uriResolver, cropData, (whitespaceURI) => {
        resolve(whitespaceURI)
      }, (err) => {
        reject(err)
      })
    });
    const base64Resolver = await RNFS.readFile(whitespaceURIResolver, "base64");
    return base64Resolver
  }