2013-09-02 32 views
11

Bir görüntü dosyasından bir Veri-URL'im var ve bunu başka bir işleve aktarmak zorundayım. Data-URL'den BufferedImage'a bu yol boyunca bir byteArray olması gerekir.Veri Dosyasını BufferedImage'ye Dönüştürme

String dataUrl; 
byte[] imageData = dataUrl.getBytes(); 

// pass the byteArray along the path 

// create BufferedImage from byteArray 
BufferedImage inputImage = ImageIO.read(new ByteArrayInputStream(imageData)); 

// If the picture is null, then throw an unsupported image exception. 
if (inputImage == null) { 
    throw new UnknownImageFormatException(); 
} 

sorundur, her zaman inputImage, ImageIO.read ImageType tanımadığı anlamına gelir ki, null anlamına UnknownImageFormatException İstisna, atar:

yaklaşımım şu oldu.

Ben ImageIO.getReaderFormatNames kullandım() desteklenen dosya adları almak ve aşağıdaki liste var etmek: Bildiğim kadarıyla olarak data:image/png;base64,... veya data:image/jpg;base64,...

: gibi geçmek deneyin

Supported Formats: 
jpg, BMP, bmp, JPG, jpeg, wbmp, png, JPEG, PNG, WBMP, GIF, gif 

dataURLs edilir Anladığım kadarıyla, bunlar desteklenen dosya listesindedir ve bu nedenle tanınmalıdır.

Bu durumda inputImage'ın null olması neye sebep olabilir? Ve daha ilginç, nasıl çözerim?

+3

Dizgeyi base64'ten ImageIO'nun okuyabileceği bir ikili formata dönüştürmeniz gerekiyor veya bir URL nesnesiniz varsa, belki de doğrudan ImageIO'ya iletmeniz gerekiyor – MadProgrammer

+2

@MadProgrammer'ın önerisine ek olarak, DatatypeConverter'] (http://docs.oracle.com/javase/7/docs/api/javax/xml/bind/DatatypeConverter.html#method_summary) tabanı 64 dizgisini bir bayt [] 'a dönüştürmek için. –

cevap

16

Zaten yorumların görüntü verilerinin Base64 kodlu olduğu söylendiği gibi. İkili verileri almak için, tip/kodlama başlıklarını şeritlemeniz gerekir, ardından Base64 içeriğini ikili veri olarak deşifre edin.

String encodingPrefix = "base64,"; 
int contentStartIndex = dataUrl.indexOf(encodingPrefix) + encodingPrefix.length(); 
byte[] imageData = Base64.decodeBase64(dataUrl.substring(contentStartIndex)); 

ben ortak çözücü, diğer Base64 kod çözücüleri de çalışması gerekir Apaches gelen org.apache.commons.codec.binary.Base64 kullanın.

+5

Java 8'den itibaren, çekirdek JDK'da bir Base64 kodlayıcı/kod çözücü var: http://download.java.net/jdk8/docs/api/java/util/Base64.html – Jules

3

RFC2397 dizesiyle tek sorun verilerinin öncesinde her şeyi şartname ama data: ve opsiyonel , geçerli:

data:[<mediatype>][;base64],<data> 

Yani saf Java 8 çözüm muhasebe bu olurdu: Elbette

final int dataStartIndex = dataUrl.indexOf(",") + 1; 
final String data = dataUrl.substring(dataStartIndex); 
byte[] decoded = java.util.Base64.getDecoder().decode(data); 

dataStartIndex kontrol edilmelidir.