Entries Tagged as Image Manipulation

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>

Powered by

© 2010-2018 NOOREE.COM