위챗 미니프로그램에서 사진의 EXIF 메타데이터 추출하는 방법

위챗 미니프로그램 환경에서는 브라우저의 전역 객체인 windowdocument가 존재하지 않기 때문에, 일반적인 EXIF 라이브러리를 그대로 사용하면 런타임 에러가 발생합니다. 가장 널리 쓰이는 exif-js 라이브러리를 미니프로그램에 맞게 수정하여 이미지의 촬영 정보를 읽어오는 방법을 살펴봅니다.

1. 라이브러리 설치

먼저 프로젝트 경로에서 npm을 통해 라이브러리를 설치합니다.

npm install exif-js --save

2. 이미지 선택 및 바이너리 데이터 읽기

미니프로그램에서 이미지의 EXIF 정보를 추출하려면 먼저 wx.chooseImage로 이미지를 선택하고, FileSystemManager를 통해 해당 파일을 ArrayBuffer 형태로 읽어와야 합니다.

// 이미지 선택 및 데이터 추출 함수
async function handlePhotoExif() {
  try {
    const photoInfo = await pickImage();
    if (!photoInfo) return;

    const fs = wx.getFileSystemManager();
    fs.readFile({
      filePath: photoInfo.path,
      success: (res) => {
        // res.data는 ArrayBuffer 타입입니다.
        EXIF.getData(res.data, function() {
          const allMetaData = EXIF.getAllTags(this);
          const formattedString = EXIF.pretty(this);
          console.log('메타데이터 결과:', allMetaData);
          console.log('포맷팅된 정보:', formattedString);
        });
      },
      fail: (err) => console.error('파일 읽기 실패:', err)
    });
  } catch (error) {
    console.error('이미지 선택 중 오류:', error);
  }
}

// 이미지 선택 헬퍼 함수
function pickImage() {
  return new Promise((resolve, reject) => {
    wx.chooseImage({
      count: 1,
      sizeType: ['original'],
      sourceType: ['album', 'camera'],
      success: (res) => {
        const file = res.tempFiles[0];
        const LIMIT_SIZE = 20 * 1024 * 1024; // 20MB 제한

        if (file.size > LIMIT_SIZE) {
          return reject(new Error('이미지 용량이 너무 큽니다.'));
        }
        resolve(file);
      },
      fail: (e) => reject(e)
    });
  });
}

3. exif-js 내부 코드 수정 (미니프로그램 호환성)

설치된 exif-js 소스 코드를 그대로 사용하면 미니프로그램 환경에서 self 또는 Image 객체를 찾을 수 없다는 오류가 발생합니다. 이를 해결하기 위해 라이브러리 내부를 다음과 같이 수정해야 합니다.

A. 전역 객체 참조 수정

라이브러리 상단에서 self가 정의되지 않아 발생하는 TypeError: Cannot read property 'Image' of undefined를 방지하기 위해 전역 객체 바인딩을 수정합니다.

// exif-js 내부 수정
var root = this;
var self = this || {}; // window 대신 현재 컨텍스트 사용

B. ArrayBuffer 지원 추가

미니프로그램의 readFileArrayBuffer를 반환합니다. getImageData 함수가 이 데이터 타입을 인식하도록 조건을 추가해야 합니다.

function getImageData(img, callback) {
    if (img instanceof ArrayBuffer) {
        handleBinaryFile(img, callback);
    } else if (/* 기존 조건문 */) {
        // ...
    }
}

C. Blob 미지원 대응

미니프로그램에는 Blob 객체가 없으므로, 라이브러리 내부에서 Blob을 참조할 때 에러가 발생하지 않도록 빈 함수나 가짜 객체를 선언해줍니다.

// 라이브러리 최상단에 추가
var Blob = typeof Blob !== 'undefined' ? Blob : function() {};

요약

위의 수정 과정을 거치면 exif-js를 위챗 미니프로그램에서도 정상적으로 사용할 수 있습니다. 핵심은 파일 시스템 매니저를 통해 이미지를 ArrayBuffer로 읽어오는 것과, 브라우저 전용 API(Blob, Window)에 의존하는 라이브러리 내부 로직을 미니프로그램 환경에 맞게 폴리필(Polyfill)하거나 수정하는 것입니다.

태그: WeChat Mini Program EXIF.js Image Metadata JavaScript Mobile Development

6월 23일 23:59에 게시됨