2017-11-30 13 views
3

複数のファイル(画像とtxtファイル)をGluon ShareServiceとどのように共有できるかを知りたい。特に以前に撮影してギャラリーに保存した画像をPictureServiceと共有する方法。複数のファイルをGluon ShareService(画像とtxt)で共有する

しかし、最初にパスとイメージ名でファイルを作成する必要があります。残念ながら、PictureServiceは、画像が撮影された瞬間の日時で構成される画像タイトルで画像を保存します。

loadImageFromGalleryメソッドでイメージ名を取得しようとしましたが、これはvoidを返し、最近の画面を開きます。ここで

は、私たちがイメージを共有しようとしました:

public void sharePicture() { 
    Services.get(PicturesService.class).ifPresent(picturesService -> { 
      Image image = picturesService.loadImageFromGallery().get(); 
     File file= new File("Pictures", image.toString()); 
     Services.get(ShareService.class).ifPresent(service -> { 
     service.share("image/jpg", file); 
     }); 
    }); 
    } 
  • どのように私たちは私たちが望むのタイトルとしたい画像を保存することができますか?
  • どのようにファイルと画像を共有できますか?

答えて

2

ギャラリーから画像を選択して共有するには、Charm Downとは異なるサービスを組み合わせて、適切な道を歩いています。

しかし、このアプローチでは大きな問題があります。JavaFX ImageFileに簡単に変換することはできません。

これまでのところ、PicturesServiceはFileではなくJavaFX Imageのみを返します。したがって、そのイメージを読み込んで共有できるファイルに保存する必要があります。

モバイルではSwingUtilitiesがないため、プロセスが簡単ではありません。

PixelReaderを使用してイメージを読み取り、バイト配列を取得する初期の方法は、実際には機能しません。これは、読み込みまたは共有できない大きな生ファイルを提供するためです。

私はJavaFXのイメージからPNGのバイト配列を取得するために、PNGエンコーダを使用しています。このsolutionが使用した:

PngEncoderFX encoder = new PngEncoderFX(image, true); 
byte[] bytes = encoder.pngEncode(); 

は、その後、私は内のファイルにそのバイト配列を保存します

private File getImageFile(Image image) { 
    if (image == null) { 
     return null; 
    } 

    // 1. Encode image to png 
    PngEncoderFX encoder = new PngEncoderFX(image, true); 
    byte[] bytes = encoder.pngEncode(); 

    // 2.Write byte array to a file in public storage 
    File root = Services.get(StorageService.class) 
      .flatMap(storage -> storage.getPublicStorage("Pictures")) 
      .orElse(null); 
    if (root != null) { 
     File file = new File(root, "Image-" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("uuuuMMdd-HHmmss")) + ".png"); 
     try (FileOutputStream fos = new FileOutputStream(file)) { 
      fos.write(bytes); 
      return file; 
     } catch (IOException ex) { 
      System.out.println("Error: " + ex); 
     } 
    } 
    return null; 
} 

さて、あなたはそれをファイルに保存し、最終的にshare、画像を取得し、PicturesServiceを呼び出すことができます:

私は `StorageServiceを使用して取得できるというパブリックストレージフォルダ(それを共有することができます)、
Services.get(PicturesService.class).ifPresent(pictures -> { 
    // 1. Retrieve picture from gallery 
    pictures.loadImageFromGallery().ifPresent(image -> { 
     // 2. Convert image to file 
     File imageFile = getImageFile(image); 

     // 3. Share file 
     if (imageFile != null) { 
      Services.get(ShareService.class).ifPresent(share -> { 
       share.share("image/png", imageFile); 
      }); 
     } 
    }); 
}); 

大きな画像をエンコードしようとすると、メモリの問題が発生することがあります。

とにかく、PicturesServiceが最初にファイルを返すと、すべてのプロセスが単純化される可能性があります。問題を提出する場合は、hereとすることができます。

EDIT

メモリの問題を回避するために、共有ファイルのサイズを小さくすることが可能溶液、およびこのsolutionに基づいて、それが特定のサイズを超えた場合にそれのように、元画像を縮小されていますこの方法はgetImageFile()で使用できるようになりました

private Image scaleImage(Image source) { 
    // Possible limit based on memory limitations 
    double maxResolution = 1280; 

    double width = source.getWidth(); 
    double height = source.getHeight(); 
    double targetWidth = width; 
    double targetHeight = height; 
    if (width > maxResolution || height > maxResolution) { 
     double ratio = width/height; 
     if (ratio > 1) { 
      targetWidth = maxResolution; 
      targetHeight = targetWidth/ ratio; 
     } 
     else { 
      targetHeight = maxResolution; 
      targetWidth = targetHeight * ratio; 
     } 
    } 

    ImageView imageView = new ImageView(source); 
    imageView.setPreserveRatio(true); 
    imageView.setFitWidth(targetWidth); 
    imageView.setFitHeight(targetHeight); 
    return imageView.snapshot(null, null); 
} 

// 1 Scale image to avoid memory issues 
    Image scaledImage = scaleImage(image); 

    // 2. Encode image to png 
    PngEncoderFX encoder = new PngEncoderFX(scaledImage, true); 
    byte[] bytes = encoder.pngEncode(); 

    // 3. Write byte array to a file in public storage 
    ... 
すでにPicturesServiceのiOSの実装で行われます
+0

ありがとうございました!イメージの保存と共有は正常に動作します。 しかし、複数のファイルを一度に共有することは困難です(txtファイルとjpgファイル)。それにも解決策がありますか?ジップも問題ありません。 ご協力いただきありがとうございます。 :) – BodenDokDevs

+0

PicturesServiceでは、一度に1つの選択しか許可されません。だからそれを念頭に置いて、あなたは2つのステップでそれを行うことができます:まず、画像を選択して共有ストレージフォルダに保存します。ユーザーがすべての画像を選択したら、共有ボタンを使用します。あなたは画像を持っているので、あなたは[zip](https://stackoverflow.com/a/15970455/3956070)を作成して共有することができます。 –

+0

もう一度お返事ありがとうございます! すべての画像を共有するためにzipファイルを使用することにしました – BodenDokDevs

関連する問題