2013-09-02 2 views
11

이미지 파일의 데이터 URL이 있으며 다른 기능으로 전달해야합니다. Data-URL에서 BufferedImage까지의이 경로를 따라 byteArray 여야합니다.데이터 URL을 BufferedImage로 변환

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(); 
} 

문제는, 그것은 항상 inputImage에서, ImageIO.read가에 imagetype를 인식하지 않았 음을 의미하는 null의 의미 UnknownImageFormatException 예외를 던졌습니다 :

내 방법은 다음이었다.

나는 ImageIO.getReaderFormatNames를 사용했습니다() 지원되는 파일 이름을 얻을 다음과 같은 목록을 가지고합니다 : 지금까지와 같은 data:image/png;base64,... 또는 data:image/jpg;base64,...

: 같은 내가 통과하려고

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

dataURLs됩니다 지원 파일 목록에있는 파일이므로 인식해야합니다.

그 밖의 경우에이 경우 inputImage가 null이 될 수 있습니다. 그리고 더 재미있는, 어떻게 해결합니까?

+3

문자열을 Base64에서 ImageIO가 읽을 수있는 바이너리 형식으로 다시 디코딩해야합니다. URL 객체가있는 경우 ImageIO에 직접 전달할 수도 있습니다 – MadProgrammer

+2

@MadProgrammer의 조언에 따라 [ DatatypeConverter'] (http://docs.oracle.com/javase/7/docs/api/javax/xml/bind/DatatypeConverter.html#method_summary)를 사용하여 기본 64 문자열을 다시 'byte []'로 변환합니다. –

답변

16

이미 언급 한 바와 같이 이미지 데이터는 Base64로 인코딩되어 있습니다. 이진 데이터를 검색하려면 형식/인코딩 헤더를 제거한 다음 Base64 내용을 이진 데이터로 디코딩해야합니다.

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

나는 공통 코덱, 다른 Base64로 디코더가 잘 작동한다 아파치에서 org.apache.commons.codec.binary.Base64를 사용합니다.

+5

Java 8부터, 핵심 JDK에는 Base64 인코더/디코더가 있습니다. http://download.java.net/jdk8/docs/api/java/util/Base64.html – Jules

3

는 RFC2397 문자열을 가진 하나의 문제는 데이터 전에 모든과 사양하지만 data: 및 옵션 ,입니다 :

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

그래서 순수 자바 (8) 솔루션을 차지하는이 될 것이다 : 물론

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

dataStartIndex를 점검해야합니다.

관련 문제