티스토리 뷰

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

 

반응형
댓글