ImageEncoder.java revision 33d107bf315c9cc01a02a7a4a2c10a01f62e8c85
130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni/*
230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * Copyright (C) 2011 The Android Open Source Project
330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni *
430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * Licensed under the Apache License, Version 2.0 (the "License");
530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * you may not use this file except in compliance with the License.
630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * You may obtain a copy of the License at
730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni *
830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni *      http://www.apache.org/licenses/LICENSE-2.0
930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni *
1030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * Unless required by applicable law or agreed to in writing, software
1130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * distributed under the License is distributed on an "AS IS" BASIS,
1230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * See the License for the specific language governing permissions and
1430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * limitations under the License.
1530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni */
1630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
1730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
1830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceronipackage android.filterpacks.imageproc;
1930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
2030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroniimport android.content.Context;
2130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroniimport android.filterfw.core.Filter;
22692c3bf7a1c7e2d5b1066cf7a1b057e993742c87Marius Rennimport android.filterfw.core.FilterContext;
2330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroniimport android.filterfw.core.FilterParameter;
2430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroniimport android.filterfw.core.Frame;
2530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroniimport android.filterfw.core.FrameFormat;
2630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroniimport android.filterfw.core.KeyValueMap;
27c0017fd82acec5d0427306ea5f536c3d78854f95Marius Rennimport android.filterfw.format.ImageFormat;
2830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroniimport android.graphics.Bitmap;
2930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroniimport android.graphics.Bitmap.CompressFormat;
3030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
3130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroniimport android.util.Log;
3230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
3330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroniimport java.io.FileOutputStream;
3430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroniimport java.io.BufferedOutputStream;
3530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroniimport java.io.FileNotFoundException;
3630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroniimport java.io.IOException;
3730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
3830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceronipublic class ImageEncoder extends Filter {
3930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
4030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    @FilterParameter(name = "fileName", isOptional = false)
4130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    private String mOutputName;
4230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
4330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    @FilterParameter(name = "context", isOptional = false)
4430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    private Context mContext;
4530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
4630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    public ImageEncoder(String name) {
4730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        super(name);
4830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
4930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
5033d107bf315c9cc01a02a7a4a2c10a01f62e8c85Wei Hua    @Override
5130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    public String[] getInputNames() {
5230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        return new String[] { "image" };
5330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
5430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
5533d107bf315c9cc01a02a7a4a2c10a01f62e8c85Wei Hua    @Override
5630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    public String[] getOutputNames() {
5730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        return null;
5830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
5930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
6033d107bf315c9cc01a02a7a4a2c10a01f62e8c85Wei Hua    @Override
61692c3bf7a1c7e2d5b1066cf7a1b057e993742c87Marius Renn    public boolean acceptsInputFormat(int index, FrameFormat format) {
62c0017fd82acec5d0427306ea5f536c3d78854f95Marius Renn        FrameFormat requiredFormat = ImageFormat.create(ImageFormat.COLORSPACE_RGBA,
63c0017fd82acec5d0427306ea5f536c3d78854f95Marius Renn                                                        FrameFormat.TARGET_UNSPECIFIED);
64c0017fd82acec5d0427306ea5f536c3d78854f95Marius Renn        return format.isCompatibleWith(requiredFormat);
6530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
6630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
6733d107bf315c9cc01a02a7a4a2c10a01f62e8c85Wei Hua    @Override
68692c3bf7a1c7e2d5b1066cf7a1b057e993742c87Marius Renn    public FrameFormat getOutputFormat(int index) {
6930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        return null;
7030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
7130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
7233d107bf315c9cc01a02a7a4a2c10a01f62e8c85Wei Hua    @Override
73692c3bf7a1c7e2d5b1066cf7a1b057e993742c87Marius Renn    public int process(FilterContext env) {
7430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        Frame input = pullInput(0);
7530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        Bitmap bitmap = input.getBitmap();
7630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        FileOutputStream outStream = null;
7730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
7830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        try {
7930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni            outStream = mContext.openFileOutput(mOutputName, Context.MODE_PRIVATE);
8030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        } catch (FileNotFoundException exception) {
8130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni            throw new RuntimeException("ImageEncoder: Could not open file: " + mOutputName + "!");
8230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        }
8330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
8430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        BufferedOutputStream bufferedStream = new BufferedOutputStream(outStream);
8530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        bitmap.compress(CompressFormat.JPEG, 80, bufferedStream);
8630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
8730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        try {
8830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni            bufferedStream.flush();
8930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni            bufferedStream.close();
9030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        } catch (IOException exception) {
9130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni            throw new RuntimeException("ImageEncoder: Could not write to file: " +
9230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni                                       mOutputName + "!");
9330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        }
9430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
9530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        return Filter.STATUS_WAIT_FOR_ALL_INPUTS;
9630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
9730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
9830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni}
99