티스토리 뷰
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] URL로 부터 File Download 하는 방법
들어가며 웹 상에 호스팅된 리소스(이미지, 동영상)을 다운로드 받고자 할 때가 있습니다. 이럴때 리소스의 URL를 이용하여 로컬로 저장하는 방법에 대해서 알아보겠습니다. 방법 Java IO를 사용하
jinseongsoft.tistory.com
[JavaFX] snapshot 메소드를 이용해서 Node 이미지 파일로 캡쳐하기
snapshot 메소드를 이용해 Node 이미지 파일로 캡쳐하기 이번시간에는 JavaFX에서 특정 영역을 캡쳐 하고 싶거나 어떤 Node를 이미지 파일로 저장하고 싶을 때가 있습니다. 이럴때 간단하게 해결할 ��
jinseongsoft.tistory.com
(Java) BufferedImage 이미지 파일(PNG, JPEG, TIFF)로 출력하는 방법
Java 이미지 파일 출력 방법 메모리상의 BufferedImage 인스턴스를 외부로 이미지 파일 형태로 출력하는 방법에 대해서 공유하고자 한다. 구현방법 TIFF 출력방법 public void saveToImage(File toSave, String fo..
jinseongsoft.tistory.com
반응형
'프로그래밍 > 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
- 자전거 여행
- 방통대 과제물
- git
- JavaFX Table View
- 일본여행
- windows
- 자바
- 스프링부트
- TableView
- JavaFX Window Close
- effective java
- 자전거
- 배낭 여행
- Java UI
- springboot
- 배낭여행
- 텐트
- 이펙티브
- JavaFX
- 이펙티브자바
- effectivejava
- 일본 배낭여행
- JavaFX 종료
- intelij
- 인텔리제이
- JavaFX 테이블뷰
- 일본 여행
- 일본 자전거 여행
- 이펙티브 자바
- java
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함