2016-11-27 2 views
1

デバイスのカメラにアクセスして画像をスナップし、ImageViewのソースとして設定してファイルに保存するカスタムコンポーネントを作成しました。 は、ここで私はちょうど撮影された画像にimageViews」ソースの設定ここでImageViewのNativescriptカスタムコンポーネントのファイルに画像を保存する方法

export function cameraLoaded(args):void{ 
    cameraPage = <Page> args.object; 
    imageView = <Image> cameraPage.getViewById("img_upload");... 
} 

の初期化Javascriptコード

CAMERA.JSここ

されている

export function takePicture():void{ 
    camera.takePicture(
     { 
     }) 
     .then(
      function(picture){ 
       imageView.imageSource = picture; 
     },function(error){ 
    }); 
} 

これはperf間違いなく

今、画像をファイルに保存しようとしています。

Image<img_upload>@file:///app/views/camera/camera.xml:4:5; 

けど​​)私が見た場合、それは'undefined`です:

export function saveToFile():void{ 

    try { 
     let saved = imageView.imageSource.saveToFile(path,enums.ImageFormat.png); 
     HalooseLogger.log(saved,"upload"); 
     }) 
    }catch (e){ 
     ... 
    } 
} 

は、ここで私は、エラー、私はここに出力され console.log(imageView)場合、これは実際には、非常に珍しいです cannot read property saveToFile of undefined を取得します。 これはどのように可能ですか?私は間違って何をしていますか?

追加情報 次のように前のコードとrelatex XMLが別のビューに含まれている:

MAIN.XML

<Page 
xmlns="http://schemas.nativescript.org/tns.xsd" 
xmlns:cameraPage="views/camera" 
loaded="loaded"> 
<StackLayout orientation="vertical"> 
    <StackLayout id="mainContainer"> 
    <!-- DYNAMIC CONTENT GOES HERE --> 
    </StackLayout> 
</StackLayout> 
</Page> 

MAIN.JS

これは、カメラビューがloadPage方法は、以下のん動的

export function loaded(args):void{ 
    mainPage = <Page>args.object; 
    contentWrapper = mainPage.getViewById("mainContainer"); 
DynamicLoaderService.loadPage(mainPage,contentWrapper,mainViewModel.currentActive); 
} 

ロードされたされています

public static loadPage(pageElement,parentElement,currentActive):void{ 
     let component = Builder.load({ 
      path : "views/camera", 
      name : "camera", 
      page : pageElement 
     }); 
     parentElement.addChild(component); 
    } 

答えて

2

事がNativeScriptのようアンドロイド用に作成画像がします2.4.0ということですプロパティの値は常にnullを返しますimageSource現在のところ、複数の大きなイメージを扱うときにメモリ不足の問題を防ぐ方法が最適化されており、image-assetがnativeScript 2.4.0で表示されています。

は今、私はあなたがnativescript-camera最新のを使用している場合はわからない(強く推奨)が、もしそうなら、あなたはtakePictureからの約束は()ImageAssetにを返していることを考慮すべきです。メモリ最適化のために、特に作成しない限り、imageSourceは未定義(Android用)を常に返します。これはカメラのコールバックから返されたImageAssetを提供するfromAsset()メソッドで行うことができます。

例:トリックをした

import { EventData } from 'data/observable'; 
import { Page } from 'ui/page'; 

import { Image } from "ui/image"; 
import { ImageSource, fromAsset } from "image-source"; 
import { ImageAsset } from "image-asset"; 

import * as camera from "nativescript-camera"; 
import * as fs from "file-system"; 

var imageModule = require("ui/image"); 
var img; 
var myImageSource: ImageSource; 

// Event handler for Page "navigatingTo" event attached in main-page.xml 
export function onLoaded(args: EventData) { 
    // Get the event sender 
    let page = <Page>args.object; 

    img = <Image>page.getViewById("img"); 

    camera.requestPermissions(); 
} 

export function takePhoto() { 
    camera.takePicture() 
     .then(imageAsset => { 
      console.log("Result is an image asset instance"); 
      img.src = imageAsset; 

      fromAsset(imageAsset).then(res => { 
       myImageSource = res; 
       console.log(myImageSource); 
      }) 
     }).catch(function (err) { 
      console.log("Error -> " + err.message); 
     }); 
} 

export function saveToFile(): void { 



    var knownPath = fs.knownFolders.documents(); 
    var folderPath = fs.path.join(knownPath.path, "CosmosDataBank"); 

    var folder = fs.Folder.fromPath(folderPath); 
    var path = fs.path.join(folderPath, "Test.png"); 

    var saved = myImageSource.saveToFile(path, "png"); 
    console.log(saved); 
} 
+0

!これらの新しいプラグインと方法についてはどこで知ることができますか? –

関連する問題