綁定帳號登入

Android 台灣中文網

打印 上一主題 下一主題

[軟體] 修改圖片裡面的exif資訊

[複製連結] 查看: 4771|回覆: 0|好評: 0
跳轉到指定樓層
樓主
iamjason008 | 收聽TA | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
發表於 2013-12-27 17:38

馬上加入Android 台灣中文網,立即免費下載應用遊戲。

您需要 登錄 才可以下載或查看,沒有帳號?註冊

x
本帖最後由 iamjason008 於 2013-12-27 17:40 編輯

Library Source出處:https://code.google.com/p/sanselanandroid/
由於我包不出jar file,所以我在網路上找到別人包好的: http://mvnrepository.com/artifact/org.apache.sanselan/sanselan/0.97-incubator


由於我需要把一些資訊寫到圖片裡面,之後再從圖片裡面把這些資訊讀出來
原本是想要建一個資料庫存那些資訊,但由於檔案是曝露在太陽底下,user很容易操作這個目錄下的檔案
這樣會讓我的資料庫記錄跟目錄中的圖片產生不一致的狀況,之後還要去做同步的動作~~我覺得很麻煩!!

使用方法:
1.從出處取得jar file,放在你專案下libs目錄
2.呼叫的範例如下:
[寫到Mark note這個欄位下]
    public void writeScanParameterToExif(String inputFilename, byte[] settings){
            File originalFile = new File(inputFilename);
            try {
                    JpegImageMetadata jpegMetadata = (JpegImageMetadata) Sanselan.getMetadata(originalFile);
                    TiffImageMetadata exif;
                    if (jpegMetadata != null) {
                            exif = jpegMetadata.getExif();
                    } else {
                            exif = null;
                    }
                    TiffOutputSet outputSet = null;
                    if (exif != null) {
                            outputSet = exif.getOutputSet();
                    }
                    if (outputSet == null) {
                            outputSet = new TiffOutputSet();
                    }
                   
                    String commentString = new String(settings);//settings.toSting() not worked!!!!
                    byte[] bytesComment =
                                    ExifTagConstants.EXIF_TAG_MAKER_NOTE.encodeValue(TiffFieldTypeConstants.FIELD_TYPE_ASCII,
                                                    commentString, outputSet.byteOrder);
                    TiffOutputField commentField = new
                                    TiffOutputField(ExifTagConstants.EXIF_TAG_MAKER_NOTE,
                                                    ExifTagConstants.EXIF_TAG_MAKER_NOTE.dataTypes[0],
                                                    bytesComment.length, bytesComment);
                    outputSet.getOrCreateExifDirectory().add(commentField);
                   
                    File tempFile = new File(Environment.getExternalStorageDirectory()+ "/tempImage.jpg");
                    OutputStream os = new FileOutputStream(tempFile);
                    os = new BufferedOutputStream(os);
                    try {
                            new ExifRewriter().updateExifMetadataLossless(originalFile, os, outputSet);//無法寫在同一個檔案上面!
                    } finally {
                            os.close();
                            //將暫存檔名Rename成原檔名!
                                tempFile.renameTo(originalFile);
                    }
            } catch (Exception ex) {
                    ex.printStackTrace();
            }
    }
   
    public void extractScanParameterFromExif(String imagePath) {
            try {
                    IImageMetadata metadata = Sanselan.getMetadata(new File(imagePath));
                    if (metadata instanceof JpegImageMetadata) {
                            JpegImageMetadata jpegMetadata = (JpegImageMetadata) metadata;
                            if (jpegMetadata != null) {
                                        TiffField field = jpegMetadata.findEXIFValue(ExifTagConstants.EXIF_TAG_MAKER_NOTE);
                                        String comment = null;
                                        if (field != null)
                                                comment = field.getValueDescription();
//                                        Log.d(LOG_TAG, "@@@@comment=" + comment);
                                        int [] settings = new int[5];
                                        String [] splitStrings = comment.split(",");
                                        for (int i= 0; i< 5;i++){
                                                settings = Integer.valueOf(splitStrings.trim());
                                                Log.d(LOG_TAG, "@@@@settings[" + i+ "]=" + settings);
                                        }
                            }
                    }
            } catch (Exception e) {
                    e.printStackTrace();
            }
    }

[寫到gps/artist/user comment]
    public void testSanselanandroid(){
            File originalFile = new File(ImageGridFragment.PICTURE_DIR + "yyyyyy.jpg");
            try {
                    JpegImageMetadata jpegMetadata = (JpegImageMetadata) Sanselan.getMetadata(originalFile);
                    TiffImageMetadata exif;
                    if (jpegMetadata != null) {
                            exif = jpegMetadata.getExif();
                    } else {
                            exif = null;
                    }
                    TiffOutputSet outputSet = null;
                    if (exif != null) {
                            outputSet = exif.getOutputSet();
                    }
                    if (outputSet == null) {
                            outputSet = new TiffOutputSet();
                    }
                    outputSet.setGPSInDegrees(123.456f, 99.34f);
                   
                    byte[] bytesComment =
                                    ExifTagConstants.EXIF_TAG_USER_COMMENT.encodeValue(TiffFieldTypeConstants.FIELD_TYPE_ASCII,
                                                    "KasperComment", outputSet.byteOrder);
                    byte[] bytesAuthor =
                                    TiffTagConstants.TIFF_TAG_ARTIST.encodeValue(TiffFieldTypeConstants.FIELD_TYPE_ASCII,
                                                    "KasperAuthor", outputSet.byteOrder);
                    TiffOutputField commentField = new
                                    TiffOutputField(ExifTagConstants.EXIF_TAG_USER_COMMENT,
                                                    ExifTagConstants.EXIF_TAG_USER_COMMENT.dataTypes[0],
                                                    bytesComment.length, bytesComment);
                    TiffOutputField authorField = new
                                    TiffOutputField(TiffTagConstants.TIFF_TAG_ARTIST,
                                                    TiffTagConstants.TIFF_TAG_ARTIST.dataTypes[0], bytesAuthor.length,
                                                    bytesAuthor);
                    outputSet.getOrCreateExifDirectory().add(commentField);
                    outputSet.getOrCreateRootDirectory().add(authorField);
                   
                    File newFile = new File(ImageGridFragment.PICTURE_DIR + "yyyyyytest.jpg");
                    OutputStream os = new FileOutputStream(newFile);
                    os = new BufferedOutputStream(os);
                    try {
                            new ExifRewriter().updateExifMetadataLossless(originalFile, os, outputSet);
                    } finally {
                            os.close();
                            extractExifLatLonSans(ImageGridFragment.PICTURE_DIR + "yyyyyytest.jpg");
                    }
            } catch (Exception ex) {
                    ex.printStackTrace();
            }
    }
   
    public void extractExifLatLonSans(String imagePath) {
            try {
                    IImageMetadata metadata = Sanselan.getMetadata(new File(imagePath));
                    if (metadata instanceof JpegImageMetadata) {
                            JpegImageMetadata jpegMetadata = (JpegImageMetadata) metadata;
                            TiffImageMetadata exifMetadata = jpegMetadata.getExif();
                            if (exifMetadata != null) {
                                    TiffImageMetadata.GPSInfo gpsInfo = exifMetadata.getGPS();
                                    if (gpsInfo != null) {
                                            double latitude = gpsInfo.getLatitudeAsDegreesNorth();
                                            double longitude = gpsInfo.getLongitudeAsDegreesEast();
                                            Log.d(LOG_TAG, "@@@@latitude=" + latitude + ",longitude=" + longitude);
                                    }                                
                                        TiffField field = jpegMetadata.findEXIFValue(ExifTagConstants.EXIF_TAG_USER_COMMENT);
                                        String comment = "";
                                        if (field != null)
                                                comment = ((String)field.getValue()).substring(0);
                                        Log.d(LOG_TAG, "@@@@comment=" + comment);
                                       
                                        field = jpegMetadata.findEXIFValue(TiffTagConstants.TIFF_TAG_ARTIST);
                                        String artist = "";
                                        if (field != null)
                                                artist = ((String)field.getValue()).substring(0);
                                        Log.d(LOG_TAG, "@@@@artist=" + artist);
                            }
                    }
            } catch (Exception e) {
                    e.printStackTrace();
            }
    }


[Source Code]
sanselanandroid-master.zip (184.09 KB, 下載次數: 1)
「用Android 就來APK.TW」,快來加入粉絲吧!
Android 台灣中文網(APK.TW)

評分

參與人數 2碎鑽 +3 經驗 +1 幫助 +6 收起 理由
xorry + 3 + 1 + 5 讚一個! 錦上添花
lcctno + 1

查看全部評分

收藏收藏 分享分享 分享專題
用Android 就來Android 台灣中文網(https://apk.tw)
回覆

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 註冊

本版積分規則