ImgscalrImageManipulator extends AbstractImageManipulator { @Override public Single<Map<String, String>> getMetadata(InputStream ins) { return Single.create(sub -> { Parser parser = new AutoDetectParser(); BodyContentHandler handler = new BodyContentHandler(); Metadata metadata = new Metadata(); ParseContext context = new ParseContext(); try { parser.parse(ins, handler, metadata, context); Map<String, String> map = new HashMap<>(); String[] metadataNames = metadata.names(); for (String name : metadataNames) { map.put(name, metadata.get(name)); } sub.onSuccess(map); } catch (Exception e) { sub.onError(e); } }); } ImgscalrImageManipulator(Vertx vertx, MeshOptions options, BootstrapInitializer boot);   ImgscalrImageManipulator(Vertx vertx, ImageManipulatorOptions options, BootstrapInitializer boot); @Override Single<String> handleResize(Binary binary, ImageManipulationParameters parameters); @Override int[] calculateDominantColor(BufferedImage image); @Override Single<Map<String, String>> getMetadata(InputStream ins);  }
@Test public void testTikaMetadata() throws IOException, TikaException { InputStream ins = getClass().getResourceAsStream("/pictures/12382975864_09e6e069e7_o.jpg"); Map<String, String> metadata = manipulator.getMetadata(ins).blockingGet(); assertTrue(!metadata.isEmpty()); for (String key : metadata.keySet()) { System.out.println(key + "=" + metadata.get(key)); } }