React Native:在Android上裁剪图像

问题描述 投票:4回答:1

以下功能在iOS上有效,但在Android上无效。我想在两个平台上都达到相同的结果。

基于this official documentation,原因是Android的ImageStore程序包中缺少react-native

import {
  ImageEditor,
  ImageStore
} from 'react-native';

在Android的react-native中,裁剪图像(作为正方形)的另一种方法是什么?

cropImage(base64ImageData) {
    return new Promise((resolve, reject)=>{
      ImageStore.addImageFromBase64(
        base64ImageData,
        (photoURI)=>{
          ImageEditor.cropImage(
            photoURI,
            {offset:{x:0,y:(1920-1080)/2},size:{width:1080, height:1080}},
            (croppedURI)=>{
              ImageStore.getBase64ForTag(
                croppedURI,
                (base64CroppedData)=>{
                  ImageStore.removeImageForTag(croppedURI);
                  resolve(base64CroppedData);
                },
                (err)=>{
                  reject(err);
                }
              );
              ImageStore.removeImageForTag(photoURI);
            },
            (err)=>{
              reject(err);
            }
          );
        },
        (err)=>{
          reject(err);
        }
      );
    });
  }

更新:

有一个项目https://github.com/seancunningham/react-native-image-store-ext(最后提交,2016年10月28日),但只有implements

  • 布尔值removeImageForTag(String file_uri)

其余部分丢失:

  • 静态addImageFromBase64(base64ImageData,成功,失败)

我的初步解决方案:

  private static final String IMAGE_STORAGE_URL_SCHEME = "rct-image-store";

  @ReactMethod
  public void addImageFromBase64(String base64_image_data, Callback successCallback, Callback failureCallback){
    String imageStorageDir = this.reactContext.getApplicationContext().getFilesDir()+"/"+IMAGE_STORAGE_URL_SCHEME+"/";
    byte[] buffer = new byte[BUFFER_SIZE];
    String file_uri = imageStorageDir+"1";
    try {
      File f = new File(imageStorageDir);
      if(!f.exists()) {
        f.mkdir();
      }
      FileOutputStream fos = new FileOutputStream(file_uri, false);
      byte[] decodedImage = Base64.decode(base64_image_data, Base64.DEFAULT);
      fos.write(decodedImage);
      fos.close();
      successCallback.invoke("file://"+file_uri);
    } catch (IOException ioe) {
      failureCallback.invoke("Failed to add image from base64String"+ioe.getMessage());
    } catch (Exception e) {
      failureCallback.invoke("Failed to add image from base64String"+e.getMessage());
    }
  }
  • 静态getBase64ForTag(uri,成功,失败)

this file ImageStorageManager.java中实现

  • 静态hasImageForTag(uri,回调)
android react-native base64 crop android-bitmap
1个回答
0
投票

问题必须是偏移量+大小之和大于接受的高度,请尝试:

{offset:{x:0,y:(1920-1080)/2},size:{width:1080, height:1080 - (1920-1080)/2)}},

看看它是否有效,如果可以,只需尝试调整您的size.height大小,看看哪种对您有效! :)

© www.soinside.com 2019 - 2024. All rights reserved.