티스토리 뷰
PNG 파일 부가정보 기록
- PNG 이미지 파일에 부가적인 정보를 추가해야할 때가 있다.
- DB에 넣기엔 너무 오버하고 이미지 파일에 가볍게 추가하고 싶을때..
- PNG 파일에 메타 데이터를 넣는 방법이 있지 않을까 해서 찾아봤는데 해본 결과 생각보다는 간단하지 않아서 방법을 공유하고 한다.
해결방법
- 우선 Meta Data를 추가하는 방법은 아래와 같다.
- 근데 검색해본 결과 아래 처럼 "TextEntry -> Text" 와 같은 형식으로 값을 정의해줘야만 한다고 한다.
- 내부적으로 위 구조를 택하고 있어 요소를 추가하거나 Text가 아닌 다른 값으로 설정을 해도 안되더라 ,,
private void writeImage() {
BufferedImage buffImg;
ImageWriter writer = ImageIO.getImageWritersByFormatName("png").next();
ImageWriteParam writeParam = writer.getDefaultWriteParam();
ImageTypeSpecifier typeSpecifier = ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_INT_RGB);
IIOMetadata metadata = writer.getDefaultImageMetadata(typeSpecifier, writeParam);
addDescription(metadata, "description");
//writing the data
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageOutputStream stream = ImageIO.createImageOutputStream(baos);
writer.setOutput(stream);
writer.write(metadata, new IIOImage(buffImg, null, metadata), writeParam);
stream.close();
}
private void addDescription(IIOMetadata metadata, String desc) throws IIOInvalidTreeException {
IIOMetadataNode textEntry = new IIOMetadataNode("TextEntry");
textEntry.setAttribute("keyword", "description");
textEntry.setAttribute("value", desc);
IIOMetadataNode text = new IIOMetadataNode("Text");
text.appendChild(textEntry);
IIOMetadataNode root = new IIOMetadataNode(IIOMetadataFormatImpl.standardMetadataFormatName);
root.appendChild(text);
metadata.mergeTree(IIOMetadataFormatImpl.standardMetadataFormatName, root);
}
- 아래는 Meta Data를 읽어오는 방식이다.
- 위와 동일한 구조로 읽어 온다.
private static String getDescription(File file) {
try (ImageInputStream input = ImageIO.createImageInputStream(file)) {
Iterator<ImageReader> readers = ImageIO.getImageReaders(input);
ImageReader reader = readers.next(); // TODO: Validate that there are readers
reader.setInput(input);
IIOMetadataNode root =
(IIOMetadataNode) reader.getImageMetadata(0).getAsTree(IIOMetadataFormatImpl.standardMetadataFormatName);
NodeList entries = root.getElementsByTagName("TextEntry");
for (int i = 0; i < entries.getLength(); i++) {
IIOMetadataNode node = (IIOMetadataNode) entries.item(i);
if (node.getAttribute("keyword").equals("description")) {
return node.getAttribute("value");
}
}
} catch (IOException ignore) {
}
return null;
}
관련글
반응형
'프로그래밍 > JAVA' 카테고리의 다른 글
[Java] Video URL 다운로드 시에 전체 다운로드 되지 않는 경우 해결방법 (0) | 2020.08.09 |
---|---|
(Java)Apache Poi 사용시 "The maximum number of Cell Styles was exceeded.." 이슈 해결법 (2) | 2020.08.08 |
[Java] URL로 부터 File Download 하는 방법 (0) | 2020.08.05 |
[Java] 스트림 슬라이싱 (0) | 2020.08.04 |
[Java] Apache poi 사용시 "Zip bomb detected.." 에러 발생시 해결법 (0) | 2020.08.01 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- 자바
- 이펙티브
- 인텔리제이
- 텐트
- JavaFX
- 배낭여행
- JavaFX 종료
- windows
- springboot
- 이펙티브 자바
- TableView
- effective java
- 배낭 여행
- 자전거
- 이펙티브자바
- 자전거 여행
- git
- java
- 일본 여행
- 일본여행
- 방통대 과제물
- effectivejava
- JavaFX 테이블뷰
- Java UI
- intelij
- 스프링부트
- JavaFX Window Close
- 일본 자전거 여행
- JavaFX Table View
- 일본 배낭여행
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
글 보관함