001package org.nasdanika.ai; 002 003import java.io.IOException; 004import java.net.URL; 005import java.net.URLDecoder; 006import java.nio.charset.StandardCharsets; 007import java.util.Base64; 008 009import org.apache.commons.imaging.Imaging; 010import org.apache.commons.imaging.common.ImageMetadata; 011import org.eclipse.emf.common.util.URI; 012import org.nasdanika.common.NasdanikaException; 013 014/** 015 * Can handle data: URIs 016 */ 017public class UriImageMetadataNarrator extends ImageMetadataNarrator<URI> { 018 019 @Override 020 protected ImageMetadata getImageMetadata(URI source) { 021 try { 022 String uriStr = source.toString(); 023 if (uriStr.startsWith("data:")) { 024 int commaIndex = uriStr.indexOf(','); 025 String metadata = uriStr.substring(5, commaIndex); 026 String dataPart = uriStr.substring(commaIndex + 1); 027 028 byte[] bytes; 029 if (metadata.contains(";base64")) { 030 bytes = Base64.getDecoder().decode(dataPart); 031 } else { 032 bytes = URLDecoder.decode(dataPart, StandardCharsets.UTF_8).getBytes(StandardCharsets.UTF_8); 033 } 034 return Imaging.getMetadata(bytes); 035 } 036 return Imaging.getMetadata(new URL(uriStr).openStream(),source.lastSegment()); 037 } catch (IOException e) { 038 throw new NasdanikaException(e); 039 } 040 } 041 042}