【问题标题】:Display Image from Gallery显示图库中的图像
【发布时间】:2019-06-24 12:12:55
【问题描述】:

我有一个应用程序,允许用户从图库中选择照片或通过相机拍照。我正在尝试显示通过相机拍摄的图像,它工作正常,它返回一个文件路径,如

file:///Users/ray/Library/Developer/CoreSimulator/Devices/C8202B3B-300B-4819-8CD3-4C4AA690CE7C/ data/Applications/D82BF64E-6DD1-4645-B637-BCF65001FD29/tmp/cdv_photo_003.jpg

但是当我尝试从画廊中选择一张照片时,它会显示一个损坏的图像缩略图,并且它会变成一个文件路径。

content://com.android.providers.media.documents/document/image%3A21

Ionic CLI 版本: PRO 4.2.1

科尔多瓦版本: 8.0.0

NPM 版本: 6.4.1

Node.js 版本: 8.11.3

平台:安卓

我也尝试过寻找解决方案,但没有奏效,或者我仍然做错了什么

其中一些建议使用此代码

if (imageURI.substring(0,21)=="content://com.android") {
  photo_split=imageURI.split("%3A");
  imageURI="content://media/external/images/media/"+photo_split[1];
}

但这个解决方案并不是那么可靠,因为并非所有图像源都返回包含“content://com.android”的相同文件路径,就像来自 Google 相册的照片一样> 返回 'content://com.google.android'

_其中一些还建议在目标类型上使用DATA_URL,但这会占用大量内存并可能导致应用崩溃_

这是我的代码:

TS 文件

selectImage(sourceType) {
    const options: CameraOptions = {
      quality: 100,
      destinationType: this.camera.DestinationType.FILE_URI,
      encodingType: this.camera.EncodingType.JPEG,
      mediaType: this.camera.MediaType.PICTURE,
      saveToPhotoAlbum: true,
      sourceType: sourceType
    }

    this.camera.getPicture(options).then((imageData) => {
     let base64Image = 'data:image/jpeg;base64,' + imageData;
     this.imagePreview = imageData;
    }, (err) => {
      this.toastCtrl.presentToast(err);
    });
  }

HTML 文件

<img src="{{imagePreview}}" />;

我希望有人可以帮助我解决这个问题。提前谢谢你????。

【问题讨论】:

  • 使用 ionic 的 PhotoLibrary 从图库中获取图片
  • 你好@KajolChaudhary。我会试一试,然后让你知道结果。谢谢你的建议????
  • 你知道base64吗?
  • @KhurshidAnsari,您是否与 ionic 的 base64 本机插件有关?

标签: ionic-framework ionic3 cordova-plugins hybrid-mobile-app ionic-native


【解决方案1】:
let options: CameraOptions = {
  quality: 100,
  sourceType: this.camera.PictureSourceType.SAVEDPHOTOALBUM,
  saveToPhotoAlbum: true,
  correctOrientation: true,
  encodingType: this.camera.EncodingType.JPEG,
  destinationType: this.camera.DestinationType.FILE_URI
};

this.camera.getPicture(options).then((imageData) => {
  let photo_split=imageData.split("%3A");
  let photo_split2=photo_split[0].split("?");
  let filename = photo_split2[0].substring(photo_split2[0].lastIndexOf('/')+1);
  let path =  photo_split2[0].substring(0,photo_split2[0].lastIndexOf('/')+1);

  alert(photo_split2[0])
  alert(filename)
  alert(path)
  this.file.readAsDataURL(path, filename).then(res=> {
    alert("FUNCIONA!")
    this.imageURI = res;
  }).catch((reason) => {
    alert(JSON.stringify(reason));
  });
}).catch((reason) => {
  alert(JSON.stringify(reason));
});

//HTML

    <img alt="uploaded Image" [src]="imageURI">

【讨论】:

    【解决方案2】:

    【讨论】:

      【解决方案3】:

      试试这个:-

         //From Gallery
           ChooseGallery() {
              var _self=this;
              const options: CameraOptions = {
                allowEdit: true,
                correctOrientation: true,
                quality: 100, // picture quality
                destinationType: this.camera.DestinationType.FILE_URI,
                encodingType: this.camera.EncodingType.JPEG,
                sourceType: this.camera.PictureSourceType.SAVEDPHOTOALBUM
              }
              this.camera.getPicture(options).then((ImageData) => {
                _self.base64value = ImageData;
              })
            }
      

      来自相机

        ChooseCamera() {
          var _self=this;
          const options: CameraOptions = {
            allowEdit: true,
            correctOrientation: true,
            quality: 100, // picture quality
            destinationType: this.camera.DestinationType.FILE_URI,
            encodingType: this.camera.EncodingType.JPEG,
            mediaType: this.camera.MediaType.PICTURE
          }
          this.camera.getPicture(options).then((ImageData) => {
            _self.base64value =  ImageData;
          })
        }
      

      我希望这会有所帮助!谢谢!

      【讨论】:

      • 你好@rchau。我会试一试,然后让你知道结果。谢谢你的建议?
      • @OliverPrimo 当然可以。 :)
      • @rcau 他想要的数据 uri。
      • @rcau 我正在尝试使用 FILE_URI 而不是 Camera.DestinationType 的 DATA_URL。很抱歉,它会导致我的应用出现一些故障,我不知道如何预防,所以我坚持使用 FILE_URI。
      • @OliverPrimo 即使您使用FILE_URI,也没有太大变化。我想知道你在imageData 中得到了什么。在那里发出警报。
      【解决方案4】:

      ts:

      public base64Image:string; 
      public getImage(){
      const options: CameraOptions = {
        quality: 100,
        destinationType: this.camera.DestinationType.DATA_URL,
        encodingType: this.camera.EncodingType.JPEG,
        mediaType: this.camera.MediaType.PICTURE
      }
      
      this.camera.getPicture(options).then((imageData) => {
       this.base64Image = 'data:image/jpeg;base64,' + imageData;
      }, (err) => {
       // Handle error
      });
      }
      

      html:

      <imge src={{base64Image}} />
      

      【讨论】:

      • 我已经尝试过此解决方案,但无法同时显示图库中的图片和相机拍摄的图片。
      • 除了我使用的是destinationType: this.camera.DestinationType.FILE_URI 而不是destinationType: this.camera.DestinationType.DATA_URL,因为根据我的搜索,DATA_URL 占用更多内存,可能会导致某些应用程序崩溃。
      • @OliverPrimo 它正在应用程序中工作。 'data_url 更占用内存' - 你如何或可以在哪里找到这个参考。
      • @OliverPrimo 如果您想将所选图像发送到服务器,那么您需要 base64。
      • @OliverPrimo 如果您想使用文件 uri,那么您必须检查如何在应用程序中显示该 url。我已经完成了文件 uri,在这种情况下,我将该 url 转换为不同的,不完全记得。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多