====== TIFF 프리뷰 이미지 뷰어 가이드 ====== ===== 예시 ===== 템플릿 위치: /HTML5/OSS/tiff_preview 템플릿 파일 * [[xf5projecthome>template/screen/HTML5/OSS/tiff_preview.xml|tiff_preview.xml]] * [[xf5projecthome>template/screen/HTML5/OSS/tiff_preview.js|tiff_preview.js]] * [[xf5projecthome>template/template.html?xframe_screen_url=/HTML5/OSS/tiff_preview|새창으로 실행]] echo ''; echo ''; echo ''; ==== 화면 스크립트 ==== /** * 이미지 파일 오브젝트, 추후 로컬 저장시나 처리할때 사용한다. * 2022.07.06 이미지 페이지 단위로 인쇄하게 처리 */ this.objTiffFile = null; // 화면 로드 이벤트 function screen_on_load() { // tiff.min.js 라이브러리 로드 this.loadTiffLib(); // TIFF 이미지 URL 설정 this.fld_text_multi.settext("./ext/media/multipage.tif"); } /** * tiff.min.js 라이브러리 로드 */ function loadTiffLib() { // TIFF 이미지 처리용 라이브러리 로드 (프로젝트 환경에 따라 경로를 달라질 수 있음) // 템플릿이 저장된 디렉토리의 tiff.min.js 파일을 활용하세요. // https://github.com/seikichi/tiff.js/blob/master/README.md screen.loadjs("./ext/lib/tiff.min.js"); // 초기 설정 // When you load large tiff file, you will see the error message "Cannot enlarge memory arrays in asm.js" // in such case, please call 'Tiff.initialize({TOTAL_MEMORY: ... })' before you create a Tiff instance Tiff.initialize({ TOTAL_MEMORY: 16777216 * 10 }); } /** * URL을 File 객체로 변경해서 리턴한다. (promise 객체) * @param {string} AUrl 이미지를 가져올 URL * @returns {promise} 이미지를 File Object로 생성해서 리턴한다. */ function getFileFromURL(image_url) { var sFileName, xhr; // 이미지를 가져오기 위한 XMLHttpRequest 오브젝트 생성 xhr = new XMLHttpRequest(); // 이미지 URL에서 파일 이름 추출 sFileName = image_url.split("/").pop(); return new Promise(function (resolv, reject) { // ASYNC 방식으로 XMLHttpRequest open 함수 호출 xhr.open("GET", image_url, true); // 수신 데이터 형식을 BLOB 형식으로 지정 xhr.responseType = "blob"; // 정상 수신 이벤트 처리 함수 xhr.onload = function (event) { // 파일을 정상적으로 가져왔다. resolv(new File([event.target.response], sFileName)); }; // 오류 수신 이벤트 처리 함수 xhr.onerror = function (event) { // 파일을 제대로 못가져왔다. reject(); }; // XMLHttpRequest send 함수 호출 xhr.send(); }); } /** * Tiff File오브젝트를 이용해서 이미지를 그리기 처리한다. * @param {File} ATiffFileObj 처리할 Tiff파일오브젝트 */ function getDataURITiffFromFile(ATiffFileObj) { var _this; _this = this; // 화면 Protect 처리 screen.setscreenprotect(true, 30); // Tiff 이미지 데이터 정보 보관용 데이터셋 초기화 this.xdImage.init(); return new Promise(function (resolv, reject) { var reader = new FileReader(); reader.onload = function (e) { var buffer = e.target.result; var tiffImage = new Tiff({ buffer: buffer }); var intImageCount = tiffImage.countDirectory(); // 이미지 갯수만큼 Loop를 돌면서 데이터 셋(xdImage)에 값 설정 for (i = 0; i < intImageCount; i++) { tiffImage.setDirectory(i); _this.xdImage.addrow(false); _this.xdImage.setdata(i, 0, tiffImage.toDataURL(), false); _this.xdImage.setdata(i, 1, (i + 1).toString(10), false); _this.xdImage.setdata(i, 2, tiffImage.width(), false); _this.xdImage.setdata(i, 3, tiffImage.height(), false); } // 데이터세 이벤트 발생하여 컴포넌트에 반영 _this.xdImage.fireevent(); // Tiff 이미지 오브젝트 닫기 tiffImage.close(); // _this.lvImageLists.setselecteditem(0, true); _this.lvImageLists.setfocus(); resolv(); }.bind(_this); reader.readAsArrayBuffer(ATiffFileObj); }); } // "웹이미지로드" 버튼 이벤트, 웹에서 다운로드해서 이미지 표시 function btn_load_imagemulti_on_mouseup(objInst) { var _this; _this = this; // URL을 File 객체로 변경해서 리턴한다. (promise 객체) getFileFromURL(this.fld_text_multi.gettext()).then(function (AObjTiffFile) { _this.objTiffFile = AObjTiffFile; _this.getDataURITiffFromFile(AObjTiffFile).then(function () { screen.setscreenprotect(false); _this.FitLeftImageSize(); console.log("로드 완료"); }); }.bind(this)).catch(function () { screen.alert("파일 다운로드 실패"); }); } // "로컬파일일기" 버튼 이벤트, 사용자 PC에서 파일을 선택하여 이미지 표시 function btnSelectTiffFIle_on_mousedown(objInst) { // File 오브젝트를 이용하여 파일 선택 상자 표시 // 파일 선택시 파일 컴포넌트의 on_selectfiles 이벤트에 지정된 아래의 "objFile_on_selectfiles" 함수 호출됨 this.objFile.selectfiles("image/tiff", false); } // 좌측 리스트뷰 아이템내 이미지 썸네일을 보여주기 위한 // 작은 이미지에 대한 fit 처리한다. (아래 로직은 IE에서 작동하지 않는다.) function FitLeftImageSize() { // 좌측 리스트뷰 아이템내 이미지 썸네일을 보여주기 위한 // 작은 이미지에 대한 fit 처리한다. (아래 로직은 IE에서 작동하지 않는다.) for (var i = 0; i < this.imgSmall.length; i++) { // fit 처리 // The CSS object-fit property is used to specify // how an or