방대한 문서보다 동작하는 소프트웨어

개발

Android ExifInterface 의 기본

꽃게장세트 2015. 8. 12. 16:26

Android ExifInterface의 '기본'을 다루고자 한다.

'기본'이라는 것은 Exif 정보를 쓰기, 읽기, 복사, 인코딩, 디코딩 하는 것을 말한다.


기본을 알기에 앞서, Exif의 뜻을 알아보고자 한다.


Exif는 'Exchangeable image file format'의 줄임말이다. 우리나라 말로 '교환이미지 파일형식'이라는 의미를 갖고 있는다. 왜 이런 의미인지는 잘 모르겠다. 쉽게 생각해서 '사진정보'라고 알아두면 편하겠다. 사진정보라는 것은 사진의 위도.경도.시간.방향 등을 뜻한다. 이 글에서는 위도.경도를 기준으로 진행하고자 한다.


Exif 쓰기

    public void setExifInfo(Uri ImageUri){ // 전체 경로를 매개변수로 받는다.(/sdcard/DICM/xxx.jpg)
        if(ImageUri != null && mCurLocation != null) {  
            String strlatitude = convertTagGPSFormat(mCurLocation.getLatitude()); // 위.경도의 실제값 그대로 Exif 정보에 쓸 수 없다. 규격이 있다. 때문에 규격대로 GPS정보를 인코딩 하는 과정이 필요한다.
            String strlongtude = convertTagGPSFormat(mCurLocation.getLongitude()); //mCurLocation : Location 인스턴스 -> 37.45345과 같은 실제값을 넣어주어도 된다.

            try {
                ExifInterface exif = new ExifInterface(ImageUri.getPath()); // 이미지의 전체경로를 인자값으로 받는 ExifInterface 인스턴스를 생성한다.
                exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE, strlatitude); // 인코딩한 GPS 정보를 넣어준다.
                exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE, strlongtude);
                exif.saveAttributes(); // 저장한다.
            } catch (IOException e) {
                e.printStackTrace()
            }
        }
    }


Exif 복사


    public void copyExifInfo(Uri desUri, Uri srcUri){ // desUri -> Exif 값이 존재하는 이미지의 전체 경로, srcUri -> Exif 값이 없는 이미지의 전체 경로
        if(desUri != null && srcUri != null){
            try {
                ExifInterface srcExif = new ExifInterface(srcUri.getPath()); // Exif 값이 존재하는 이미지로 ExifInterface 인스턴스 생성
                ExifInterface desExif = new ExifInterface(desUri.getPath()); // Exif 값이 없는 이미지로 ExifInterface 인스턴스 생성

                if(srcExif != null && desExif != null) {
                    desExif.setAttribute(ExifInterface.TAG_DATETIME, srcExif.getAttribute(ExifInterface.TAG_DATETIME)); // 시간 기록
                    desExif.setAttribute(ExifInterface.TAG_GPS_LATITUDE, srcExif.getAttribute(ExifInterface.TAG_GPS_LATITUDE)); // GPS 정보 기록
                    desExif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE, srcExif.getAttribute(ExifInterface.TAG_GPS_LONGITUDE));
                    desExif.saveAttributes(); // 저장
                }
            }
            catch (IOException e) {
               e.printStrackTrace()
            }
            catch(Exception e){
               e.printStrackTrace()
            }
        }
    }

Exif 인코딩


    public String convertTagGPSFormat(double coordinate) // 인코딩하는 과정으로 GPS 정보를 매개변수로 받음
    {
        String strlatitude = Location.convert(coordinate, Location.FORMAT_SECONDS); // 인코딩하여 포멧을 갖춘다.
        String[] arrlatitude = strlatitude.split(":");
        StringBuilder sb = new StringBuilder(); // 갖춘 포멧을 분리하여 새로운 포멧을 적용한다.
        sb.append(arrlatitude[0]);
        sb.append("/1,");
        sb.append(arrlatitude[1]);
        sb.append("/1,");
        sb.append(arrlatitude[2]);
        sb.append("/1");
//        sb.append("/60,");
//        sb.append(arrlatitude[2]);
//        sb.append("/3600");

        return sb.toString();
    }

Exif 디코딩


    

private Float convertToDegree(String stringDMS){
 Float result = null;
 String[] DMS = stringDMS.split(",", 3);

 String[] stringD = DMS[0].split("/", 2);
 Double D0 = new Double(stringD[0]);
 Double D1 = new Double(stringD[1]);
 Double FloatD = D0/D1;

 String[] stringM = DMS[1].split("/", 2);
 Double M0 = new Double(stringM[0]);
 Double M1 = new Double(stringM[1]);
 Double FloatM = M0/M1;
  
 String[] stringS = DMS[2].split("/", 2);
 Double S0 = new Double(stringS[0]);
 Double S1 = new Double(stringS[1]);
 Double FloatS = S0/S1;
  
 result = new Float(FloatD + (FloatM/60) + (FloatS/3600));
  
 return result;


};