| /* |
| * Copyright (C) 2012 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.android.gallery3d.exif; |
| |
| import android.graphics.Bitmap; |
| import android.graphics.BitmapFactory; |
| import android.util.Log; |
| |
| import java.io.ByteArrayInputStream; |
| import java.io.File; |
| import java.io.FileInputStream; |
| import java.io.FileOutputStream; |
| import java.io.InputStream; |
| import java.io.OutputStream; |
| |
| public class ExifOutputStreamTest extends ExifXmlDataTestCase { |
| |
| private File mTmpFile; |
| |
| private ExifInterface mInterface; |
| |
| @Override |
| public void setUp() throws Exception { |
| super.setUp(); |
| mTmpFile = File.createTempFile("exif_test", ".jpg"); |
| } |
| |
| public ExifOutputStreamTest(int imgRes, int xmlRes) { |
| super(imgRes, xmlRes); |
| mInterface = new ExifInterface(); |
| } |
| |
| public ExifOutputStreamTest(String imgPath, String xmlPath) { |
| super(imgPath, xmlPath); |
| mInterface = new ExifInterface(); |
| } |
| |
| public void testExifOutputStream() throws Exception { |
| InputStream imageInputStream = null; |
| InputStream exifInputStream = null; |
| FileInputStream reDecodeInputStream = null; |
| FileInputStream reParseInputStream = null; |
| |
| InputStream dangerInputStream = null; |
| OutputStream dangerOutputStream = null; |
| try { |
| try { |
| byte[] imgData = Util.readToByteArray(getImageInputStream()); |
| imageInputStream = new ByteArrayInputStream(imgData); |
| exifInputStream = new ByteArrayInputStream(imgData); |
| |
| // Read the image data |
| Bitmap bmp = BitmapFactory.decodeStream(imageInputStream); |
| // The image is invalid |
| if (bmp == null) { |
| return; |
| } |
| |
| // Read exif data |
| ExifData exifData = new ExifReader(mInterface).read(exifInputStream); |
| |
| // Encode the image with the exif data |
| FileOutputStream outputStream = new FileOutputStream(mTmpFile); |
| ExifOutputStream exifOutputStream = new ExifOutputStream(outputStream, mInterface); |
| exifOutputStream.setExifData(exifData); |
| bmp.compress(Bitmap.CompressFormat.JPEG, 90, exifOutputStream); |
| exifOutputStream.close(); |
| exifOutputStream = null; |
| |
| // Re-decode the temp file and check the data. |
| reDecodeInputStream = new FileInputStream(mTmpFile); |
| Bitmap decodedBmp = BitmapFactory.decodeStream(reDecodeInputStream); |
| assertNotNull(getImageTitle(), decodedBmp); |
| reDecodeInputStream.close(); |
| |
| // Re-parse the temp file the check EXIF tag |
| reParseInputStream = new FileInputStream(mTmpFile); |
| ExifData reExifData = new ExifReader(mInterface).read(reParseInputStream); |
| assertEquals(getImageTitle(), exifData, reExifData); |
| reParseInputStream.close(); |
| |
| // Try writing exif to file with existing exif. |
| dangerOutputStream = (OutputStream) new FileOutputStream(mTmpFile); |
| exifOutputStream = new ExifOutputStream(dangerOutputStream, mInterface); |
| exifOutputStream.setExifData(exifData); |
| exifOutputStream.write(imgData); |
| // exifOutputStream.write(strippedImgData); |
| exifOutputStream.close(); |
| exifOutputStream = null; |
| |
| // Make sure it still can be parsed into a bitmap. |
| dangerInputStream = (InputStream) new FileInputStream(mTmpFile); |
| decodedBmp = null; |
| decodedBmp = BitmapFactory.decodeStream(dangerInputStream); |
| assertNotNull(getImageTitle(), decodedBmp); |
| dangerInputStream.close(); |
| dangerInputStream = null; |
| |
| // Make sure exif is still well-formatted. |
| dangerInputStream = (InputStream) new FileInputStream(mTmpFile); |
| reExifData = null; |
| reExifData = new ExifReader(mInterface).read(dangerInputStream); |
| assertEquals(getImageTitle(), exifData, reExifData); |
| dangerInputStream.close(); |
| dangerInputStream = null; |
| |
| } finally { |
| Util.closeSilently(imageInputStream); |
| Util.closeSilently(exifInputStream); |
| Util.closeSilently(reDecodeInputStream); |
| Util.closeSilently(reParseInputStream); |
| |
| Util.closeSilently(dangerInputStream); |
| Util.closeSilently(dangerOutputStream); |
| } |
| } catch (Exception e) { |
| throw new Exception(getImageTitle(), e); |
| } |
| } |
| |
| public void testOutputSpeed() throws Exception { |
| final String LOGTAG = "testOutputSpeed"; |
| InputStream imageInputStream = null; |
| OutputStream imageOutputStream = null; |
| try { |
| try { |
| imageInputStream = getImageInputStream(); |
| // Read the image data |
| Bitmap bmp = BitmapFactory.decodeStream(imageInputStream); |
| // The image is invalid |
| if (bmp == null) { |
| return; |
| } |
| imageInputStream.close(); |
| int nLoops = 20; |
| long totalReadDuration = 0; |
| long totalWriteDuration = 0; |
| for (int i = 0; i < nLoops; i++) { |
| imageInputStream = reopenFileStream(); |
| // Read exif data |
| long startTime = System.nanoTime(); |
| ExifData exifData = new ExifReader(mInterface).read(imageInputStream); |
| long endTime = System.nanoTime(); |
| long duration = endTime - startTime; |
| totalReadDuration += duration; |
| Log.v(LOGTAG, " read time: " + duration); |
| imageInputStream.close(); |
| |
| // Encode the image with the exif data |
| imageOutputStream = (OutputStream) new FileOutputStream(mTmpFile); |
| ExifOutputStream exifOutputStream = new ExifOutputStream(imageOutputStream, |
| mInterface); |
| exifOutputStream.setExifData(exifData); |
| startTime = System.nanoTime(); |
| bmp.compress(Bitmap.CompressFormat.JPEG, 90, exifOutputStream); |
| endTime = System.nanoTime(); |
| duration = endTime - startTime; |
| totalWriteDuration += duration; |
| Log.v(LOGTAG, " write time: " + duration); |
| exifOutputStream.close(); |
| } |
| Log.v(LOGTAG, "======================= normal"); |
| Log.v(LOGTAG, "avg read time: " + totalReadDuration / nLoops); |
| Log.v(LOGTAG, "avg write time: " + totalWriteDuration / nLoops); |
| Log.v(LOGTAG, "======================="); |
| } finally { |
| Util.closeSilently(imageInputStream); |
| Util.closeSilently(imageOutputStream); |
| } |
| } catch (Exception e) { |
| throw new Exception(getImageTitle(), e); |
| } |
| } |
| |
| @Override |
| public void tearDown() throws Exception { |
| super.tearDown(); |
| mTmpFile.delete(); |
| } |
| } |