ギャラリーから画像を選択して共有するには、Charm Downとは異なるサービスを組み合わせて、適切な道を歩いています。
しかし、このアプローチでは大きな問題があります。JavaFX Image
をFile
に簡単に変換することはできません。
これまでのところ、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の実装で行われます
ありがとうございました!イメージの保存と共有は正常に動作します。 しかし、複数のファイルを一度に共有することは困難です(txtファイルとjpgファイル)。それにも解決策がありますか?ジップも問題ありません。 ご協力いただきありがとうございます。 :) – BodenDokDevs
PicturesServiceでは、一度に1つの選択しか許可されません。だからそれを念頭に置いて、あなたは2つのステップでそれを行うことができます:まず、画像を選択して共有ストレージフォルダに保存します。ユーザーがすべての画像を選択したら、共有ボタンを使用します。あなたは画像を持っているので、あなたは[zip](https://stackoverflow.com/a/15970455/3956070)を作成して共有することができます。 –
もう一度お返事ありがとうございます! すべての画像を共有するためにzipファイルを使用することにしました – BodenDokDevs