Statistics
| Branch: | Tag: | Revision:

securesmartcam / app / src / main / java / org / witness / obscuracam / photo / jpegredaction / JpegRedaction.java @ 41590feb

History | View | Annotate | Download (5.01 KB)

1
package org.witness.obscuracam.photo.jpegredaction;
2

    
3
import java.io.File;
4
import java.util.ArrayList;
5
import java.util.Properties;
6

    
7
import org.witness.obscuracam.ui.ImageRegion;
8
import org.witness.obscuracam.photo.filters.CrowdPixelizeObscure;
9
import org.witness.obscuracam.photo.filters.PixelizeObscure;
10
import org.witness.obscuracam.photo.filters.RegionProcesser;
11
import org.witness.obscuracam.photo.filters.SolidObscure;
12

    
13
import android.graphics.Bitmap;
14
import android.graphics.Canvas;
15
import android.graphics.RectF;
16
import android.util.Log;
17

    
18
public class JpegRedaction implements RegionProcesser {
19
        
20
    private native void redactRegion(String src, String target, int left, int right, int top, int bottom, String method);
21
    private native void redactRegions(String src, String target, String regions);
22
    Properties mProps;
23

    
24
    static {
25
        System.loadLibrary("JpegRedaction");
26
    }
27

    
28
    private File mInFile;
29
    private File mOutFile;
30
    private String mMethod = null;
31
    
32
    private final static String METHOD_COPYSTRIP = "c";
33
    private final static String METHOD_SOLID = "s";
34
    private final static String METHOD_PIXELLATE = "p";
35
    private final static String METHOD_OVERLAY = "o";
36
    private final static String METHOD_INVERSE_PIXELLATE = "i";
37
             
38
    public JpegRedaction (RegionProcesser iMethod, File inFile, File outFile)
39
    {
40
            setFiles (inFile, outFile);
41
            
42
            if (iMethod != null)
43
                    setMethod (iMethod);
44
            
45
            mProps = new Properties();
46
            mProps.put("obfuscationType", this.getClass().getName());
47
    }
48
    
49
    public JpegRedaction ()
50
    {
51
            this (null, null, null);
52
    }
53
    
54
    
55
    public JpegRedaction (File inFile, File outFile)
56
    {
57
            this (null, inFile, outFile);
58
    }
59
    
60
    public void setFiles (File inFile, File outFile)
61
    {
62
            mInFile = inFile;
63
            mOutFile = outFile;
64
    }
65

    
66
    public void setMethod (RegionProcesser rProc)
67
    {
68
            if (rProc instanceof CrowdPixelizeObscure)
69
            {
70
                    mMethod = METHOD_INVERSE_PIXELLATE;
71
            }
72
            else if (rProc instanceof PixelizeObscure)
73
            {
74
                    mMethod = METHOD_PIXELLATE;
75
            }
76
            else if (rProc instanceof SolidObscure)
77
            {
78
                    mMethod = METHOD_SOLID;
79
            }
80
    }
81
    
82
        @Override
83
        public void processRegion(RectF rect, Canvas canvas, Bitmap bitmap) {
84

    
85
                if (mMethod != null)
86
                {
87
                         String strInFile = mInFile.getAbsolutePath();
88
                         String strOutFile = mOutFile.getAbsolutePath();
89
        
90
                         int left = Math.max(0, (int)rect.left);
91
                         int right = Math.min(canvas.getWidth(),(int)rect.right);
92
                         int top = Math.max(0, (int)rect.top);
93
                         int bottom = Math.max(canvas.getHeight(), (int)rect.bottom);
94
                         
95
                         redactRegion(strInFile, strOutFile, left, right, top, bottom, mMethod);
96
                     
97
                     // return properties and data as a map
98
                     mProps.put("initialCoordinates", "[" + rect.top + "," + rect.left + "]");
99
                     mProps.put("regionWidth", Float.toString(Math.abs(rect.left - rect.right)));
100
                         mProps.put("regionHeight", Float.toString(Math.abs(rect.top - rect.bottom)));
101
                }
102
                
103
        }
104
        
105
        public void processRegions(ArrayList<ImageRegion> iRegions, float inSampleSize, Canvas canvas) {
106

    
107
                 String strInFile = mInFile.getAbsolutePath();
108
                 String strOutFile = mOutFile.getAbsolutePath();
109
                 
110
                 //l,r,t,b[:method];
111
                 StringBuffer sbRegions = new StringBuffer();
112
                 int rWidth = (int)( canvas.getWidth()*inSampleSize);
113
                 int rHeight = (int)(canvas.getHeight()*inSampleSize);
114
                 
115
                for (ImageRegion currentRegion : iRegions)
116
            {
117
                        RegionProcesser rProc = currentRegion.getRegionProcessor();
118
                        
119
            RectF rect = new RectF(currentRegion.getBounds());
120
            rect.left *= inSampleSize;
121
            rect.top *= inSampleSize;
122
            rect.right *= inSampleSize;
123
            rect.bottom *= inSampleSize;
124

    
125
                         int left = Math.max(0, (int)rect.left);
126
                         int right = Math.min(rWidth,(int)rect.right);
127
                         int top = Math.max(0, (int)rect.top);
128
                         int bottom = Math.min(rHeight, (int)rect.bottom);
129
            
130
            sbRegions.append(left);
131
            sbRegions.append(',');
132

    
133
            sbRegions.append(right);
134
            sbRegions.append(',');
135

    
136
            sbRegions.append(top);
137
            sbRegions.append(',');
138

    
139
            sbRegions.append(bottom);
140
            sbRegions.append(':');
141

    
142
            if (rProc instanceof CrowdPixelizeObscure)
143
                {
144
                        mMethod = METHOD_INVERSE_PIXELLATE;
145
                }
146
                else if (rProc instanceof PixelizeObscure)
147
                {
148
                        mMethod = METHOD_PIXELLATE;
149
                }
150
                else if (rProc instanceof SolidObscure)
151
                {
152
                        mMethod = METHOD_SOLID;
153
                }
154
            
155
            sbRegions.append(mMethod);
156
            sbRegions.append(';');
157
            
158
            
159
            }
160

    
161
                Log.d("jpegredaction:size", rWidth + "x" + rHeight);
162
                Log.d("jpegredaction:regions", sbRegions.toString());
163
                
164
            redactRegions(strInFile, strOutFile, sbRegions.toString());
165
                
166
        }
167
        
168
        public Properties getProperties()
169
        {
170
                return mProps;
171
        }
172
        
173
        public void setProperties(Properties props)
174
        {
175
                mProps = props;
176
        }
177
        @Override
178
        public Bitmap getBitmap() {
179
                // TODO Auto-generated method stub
180
                return null;
181
        }
182
}