Image에서 meta 데이터를 없애자!!

JPG나 PNG에는 이미지의 다양한 정보가 들어 있습니다. EXIF, IPTC, XMP 같은 것 들이죠. 카메라 제조사마다 약간씩 차이는 있겠지만 이미지노출정보라던가 촬영일, GPS가 내장된 기기라면 촬영장소 등이 저장되는 정보입니다. 

일반적으로 개인소장 이미지라면 별 문제가 없지만 인터넷에 공개될 이미지라면 이들 정보가 들어가 있으면 용량도 커지고 개인정보 노출 등의 문제점도 있으므로 공개할 이미지에서는 웬만하면 이들 메타정보를 제거하는게 낫다고 합니다.(http://html.nhncorp.com/markup_tools/imgoptimizer 참조)

보통의 경우 Photoshop에서 Save for Web 옵션으로 저장한 경우 이들 메타정보가 제거되지만 이미 서버상에 수많이 올라온 이미지들의 메타정보를 한번에 제거하려면, ColdFusion에서 처리하는 방법과 외부 Tool을 이용해서 처리할 수 있습니다.

하지만 ColdFusion에서 제공하는 Image관련 함수와 태그로 제거하려면 이미지를 재합성하는 등 프로세싱에 많은 자원이 소모되므로 간단하게 쉘 응용프로그램(ImageMagick)을 이용해서 바꾸도록 하는 것이 낫겠죠.

ColdFusion에서 자체적으로 제공하는 태그와 함수외에 Java를 응용하려면 Sanselan 이라는 라이브러리(http://commons.apache.org/proper/commons-imaging/index.html)를 이용할 수 도 있습니다. 간단하게 Javaloader를 이용해서 Sanselan 라이브러리를 로드한 다음 Sanselan에서 제공하는 removeExifMetadata()함수를 이용하여 제거할 수 있습니다. (http://stackoverflow.com/questions/5520444/generating-thumbnails-using-cf8-cfimage-tag-large-filesize-caused-by-image-met 참조)

<cfscript>
// setup and init the Sanselan library
SanselanPath = arrayNew(1);
arrayAppend(SanselanPath, expandPath("./sanselan-0.97-incubator.jar"));
javaloader = createObject("component", "javaloader.JavaLoader").init(SanselanPath);

// setup your source and destination image
pathToInFile = ExpandPath("./myImage.jpg");
pathToOutFile = ExpandPath("./MyImagewoEXIF.jpg");
inFile = javaloader.create("java.io.FileInputStream").init(pathToInFile);
outFile = javaloader.create("java.io.FileOutputStream").init(pathToOutFile);

// create the exifRewriter 
exifRewriter = javaloader.create("org.apache.sanselan.formats.jpeg.exifRewrite.ExifRewriter").init();

// call the method removeExifMetadata
exifRewriter.removeExifMetadata(inFile,outFile);
outFile.close();
</cfscript>

하지만 특정 디렉토리에 들어있는 모든 이미지의 메타정보를 지우려면 역시나 쉘응용프로그램을 이용하는 것이 낫겠죠? ImageMagick과 같은 쉘응용프로그램에서 다음과 같이 한줄로 처리할 수 있습니다. 바로 ImageMagick에서 제공하는 mogrify 명령을 이용합니다.(http://www.imagemagick.org/www/mogrify.html 참조)

Shell상에서는 다음과 같이 특정 디렉토리(image라는 디렉토리라고 가정)의 모든 JPG파일을 일괄변환할 수 있습니다.

find ./image -name *.jpg | xargs mogrify -strip

물론 단일 파일에 대해서는 mogrify - strip sample.jpg와 같이 쓸 수 있겠지만 ColdFusion에서 <cfexecute>태그의 arguments속성에 |(pipe)기호를 쓸 수 없으므로 디렉토내의 모든 JPG파일을 반환하는 루프를 ColdFusion으로 작성해야 합니다. 하지만 단일 이미지의 변환은 다음과 같이 쉽게 할 수 있겠죠?

<cfexecute name="mogrify" arguments="-strip /이미지절대경로/sample.jpg" timeout="60" variable="result"></cfexecute>

1 response so far

lee

lee - 12월 30, 2015 at 오후 7:59

안녕하세요.
작성해주신 내용들 덕분에 많은 도움이 되고 있습니다.

다름이 아니고 제가 java 에서 psd 파일 텍스트 레이어의
텍스트 값을 읽어오고,
다른 텍스트 값으로 수정하고,
수정된 값을 통해 파일을 다른 이름으로 저장하는 기능을 구현하고자 하는데요.

다양한 파싱 라이브러리가 있어 텍스트 값을 읽어오는 것만은 가능했지만
수정하고 새로운 파일을 쓰는 기능을 구현하는데는 어려움이 있었습니다.
그래서 찾아보다가 알게된것이 imagemagick 이라는 것을 알게 되었습니다.

혹시 가능하시면
java에서 imagemagick을 활용해서 상기 기능을 구현할수 있는지 문의드립니다.

(그리고 윈도우/java 환경에서 imagemagick을 셋팅하는 방법도 포스팅 해주실수 있으신지요 ㅠㅜ)

번거롭게 해드려 죄송합니다.
다른건 다 안되더라도 imagemagick을 통해 상기 기능이 구현가능한지만 좀 답변 부탁 드립니다.

좋은 하루 되세요.

Leave a Comment

Leave this field empty:




Powered by

© 2010-2018 NOOREE.COM