Измените изображение с помощью caman, а затем загрузите его в firebase.

Вот моя проблема. Я хочу изменить изображение с помощью caman, а затем загрузить его в firebase. это мой код

import { Component, NgZone } from '@angular/core';
import { NavController, NavParams, AlertController } from 'ionic-angular';
import firebase from 'firebase';

declare var Caman: any;

@Component({
  selector: 'page-filtri',
  templateUrl: 'filtri.html'
})
export class FiltriPage {

fotoModificata: any;
public fotoScelta;
itemRef : firebase.database.Reference = firebase.database().ref('/matrimonio1');
firestore = firebase.storage();
alertCtrl: AlertController;
imgsource: any;

  constructor(public navCtrl: NavController, public navParams: NavParams, alertCtrl: AlertController,   public zone: NgZone,
) {

    this.alertCtrl = alertCtrl;
    this.fotoScelta = navParams.get("foto");
  }

  addFilter(){

       Caman("#image", function(){
         this.brightness(5);
         this.render(function () {
         var fotoModificata = this.toBase64();

   });

 });

}


upload() {


    let storageRef = firebase.storage().ref();
    const filename = Math.floor(Date.now() / 1000);
    const imageRef = storageRef.child(`images/${filename}.jpg`);

    imageRef.putString(this.fotoModificata, firebase.storage.StringFormat.DATA_URL).then((snapshot)=> {

// il codice sotto prende l'url della foto appena caricata
         this.firestore.ref().child(`images/${filename}.jpg`).getDownloadURL().then((url) => {
           this.zone.run(() => {
             this.imgsource = url;

// carica l'url in firebase.database
      let newPostRef = this.itemRef.push();
          newPostRef.set({
            "nome" : " ",
            "url" : url
          });


            })
         });

         this.showSuccesfulUploadAlert();


       }, (err) => { });

  }

  showSuccesfulUploadAlert() {

      let alert = this.alertCtrl.create({
        title: 'Caricata!',
        subTitle: 'La foto è stata caricata!',
        buttons: ['OK']
      });
      alert.present();

      this.fotoModificata = "";

  }

}

Я точно знаю, что функция upload() работает. Как я могу экспортировать var fotoModificata из функции addFilter для использования в upload()? Если я использую console.log сразу после объявления var, я вижу в консоли строку base64 моего изображения, но если я войду в консоль где-то еще, у меня есть и undefined. Как я могу решить?


person Marco Palmisano    schedule 23.01.2018    source источник
comment
Я думаю, все, что вам нужно, это добавить, чтобы изменить эту строку: var fotoModificata = this.toBase64(); быть this.fotoModificata = this.toBase64(); но для этого вам нужно убедиться, что это указывает на весь ваш компонент. Для этого я бы использовал стрелочную функцию: Caman(#image, () =› { ... }   -  person Sergey Rudenko    schedule 24.01.2018
comment
попробуйте и дайте мне знать, если это поможет :) Я тоже учусь, но я думаю, что это должно сработать для вас.   -  person Sergey Rudenko    schedule 24.01.2018
comment
Если я использую это, у меня возникает ошибка при компиляции, в которой говорится, что яркость и рендеринг не являются свойствами filtripage.   -  person Marco Palmisano    schedule 24.01.2018
comment
Я пробовал это: 'addFilter(){ Caman(#image, function () { this.brightness(5); this.render( () =› { this.fotoModificata = this.toBase64(); }); }); } 'Но когда я вызываю upload(), у меня возникает ошибка ERROR: [object Object]   -  person Marco Palmisano    schedule 24.01.2018
comment
подождите секунду :) я думаю, что знаю, что не так - не обращайте внимания на мой предыдущий комментарий. Выложу рабочий код через 3 минуты   -  person Sergey Rudenko    schedule 24.01.2018


Ответы (1)


Хорошо, кажется, что все, что вам нужно, это передать результат функции addFilter (в настоящее время хранится в var fotoModificata) в глобальную var (fotoModificata).

Я бы сделал это ниже:

addFilter() {

    // save scope of global "this" here:
    let scope = this;

    Caman("#image", function(){
      this.brightness(5);
      this.render(function() {
      // use the scope as a pointer to the global scope to assign the value:
      scope.fotoModificata = this.toBase64();
      });
    });
  }
person Sergey Rudenko    schedule 23.01.2018
comment
Все еще есть ошибка ERROR: [object Object] в консоли, вызывающей upload() с помощью кнопки из html. Также, если я напишу после this.fotoModificata = temp; console.log(this.fotoModificata); Я получаю undefined в консоли, поэтому я думаю, что значение temp все еще каким-то образом заключено в тюрьму в функции Caman. - person Marco Palmisano; 24.01.2018
comment
Хорошо, я скопирую ваш код и посмотрю, как он работает. Удалось ли вам успешно войти в консоль base64 из вашего кода? - person Sergey Rudenko; 24.01.2018
comment
В основном - дайте мне знать, что вы получите, если ваш журнал -> var fotoModificata в функции addFilter - person Sergey Rudenko; 24.01.2018
comment
Я думаю, что мой пример сейчас неверен, так как var temp никогда не попадает в функцию... - person Sergey Rudenko; 24.01.2018
comment
Кстати, вы проверили, является ли функция рендеринга синхронной или асинхронной? возможно, ему нужна асинхронная обработка. Это объясняет, почему температура не определена... - person Sergey Rudenko; 24.01.2018
comment
Я могу использовать консольную строку base64 только в том случае, если я вызываю ее сразу после tobase64(). Как я могу проверить синхронизацию или асинхронность? - person Marco Palmisano; 24.01.2018
comment
Кажется, что рендеринг является асинхронным из-за этого github.com/meltingice/CamanJS /wiki/О блок-рендерере - person Marco Palmisano; 24.01.2018
comment
Да имеет смысл. Хорошо, тогда вам нужно использовать async/await в этой функции или использовать обещание и после разрешения вызвать функцию, которая нуждается в строке base64. У вас есть примеры с промисами? - person Sergey Rudenko; 24.01.2018
comment
Можете ли вы поделиться, как эти функции вызываются в пользовательском интерфейсе? - person Sergey Rudenko; 24.01.2018
comment
'‹ion-content padding› ‹img id='image' class=foto src={{fotoScelta}} /› ‹button ion-button (click)=addFilter()›Filtro‹/button› ‹button ion-button ( click)=upload()›Ok‹/button› ‹/ion-content›' Это мой код. Можете ли вы написать мне пример обещания? Кстати, ты действительно очень добрый. большое спасибо за помощь - person Marco Palmisano; 24.01.2018
comment
Отпишусь через 2 часа. Но, глядя на пользовательский интерфейс, кажется, что это может быть что-то еще, поскольку кнопки отдельные. - person Sergey Rudenko; 24.01.2018
comment
Спасибо еще раз. Я хотел бы использовать кнопку для применения фильтра и еще одну для загрузки окончательного изображения - person Marco Palmisano; 24.01.2018
comment
Привет, я готов помочь, но я не могу установить все зависимости из вашего проекта;/ вы можете помочь мне со следующим: если вы зарегистрируете переменную в консоли, как показано ниже: addFilter(){ Caman(# изображение, функция () { this.brightness (5); this.render (функция () { var fotoModificata = this.toBase64 (); console.log (fotoModificata) }); }); } каково значение var, которое дает вам консоль - это строка base64? - person Sergey Rudenko; 24.01.2018
comment
Да, это строка в base64 - person Marco Palmisano; 24.01.2018
comment
Извините, я как бы делаю это в слепом режиме;/ поскольку ваши кнопки отдельные, здесь не должно быть проблемы с асинхронностью. Но мне любопытно, почему значение base64 не присваивается fotoModificata. Попробуйте это ниже и посмотрите, что console.log(temp) дает вам в консоли?: addFilter(){ let temp = Caman(#image, function(){ this.brightness(5); this.render(function() { return this.toBase64(); }); // console.log(temp) this.fotoModificata = temp }); } - person Sergey Rudenko; 25.01.2018
comment
Я думаю, что знаю, почему в моем примере ответа значение не присваивается: поскольку строка base64 все еще является строкой - в тот момент, когда мы делаем this.fotoModificata = temp; во фрагменте моего ответа - мы просто присваиваем ему значение undefined. И однажды позже temp получает фактическую строку base64 - переназначение никогда не происходит. Вы можете проверить мою теорию, сделав temp = test, а затем посмотрев, что дает вам фрагмент моего ответа в консоли (он должен дать вам test) - person Sergey Rudenko; 25.01.2018
comment
Можете ли вы попробовать этот трюк сейчас: addFilter(){ let scope = this; Caman(#image, function(){ this.brightness(5); this.render(function() { scope.fotoModificata = this.toBase64(); }); }); } - person Sergey Rudenko; 25.01.2018
comment
О чувак!!! Оно работает!!! Вы спасли меня!!! Если вы ответите этим решением, я отмечу его как решенное!!! Спасибо большое - person Marco Palmisano; 25.01.2018
comment
;)) все хорошо, я тоже был озадачен и рад, что это сработало! Ответ обновлен! - person Sergey Rudenko; 25.01.2018