18
18
import com .googlecode .leptonica .android .WriteFile ;
19
19
20
20
import java .util .Collections ;
21
+ import java .util .HashSet ;
22
+ import java .util .Map ;
21
23
import java .util .Set ;
22
24
import java .util .stream .Collectors ;
23
25
24
- import java .util .HashMap ;
25
- import java .util .Map ;
26
-
27
26
import io .github .subhamtyagi .ocr .Language ;
28
27
import io .github .subhamtyagi .ocr .R ;
29
28
import kotlin .Triple ;
@@ -34,43 +33,69 @@ public class Utils {
34
33
35
34
@ SuppressLint ("DefaultLocale" )
36
35
public static String getSize (int size ) {
37
- String s = "" ;
38
- double kb = size / 1024 ;
39
- double mb = kb / 1024 ;
36
+ if ( size < 0 ) {
37
+ return "Invalid size" ;
38
+ }
40
39
if (size < 1024 ) {
41
- s = "$size Bytes" ;
42
- } else if (size < 1024 * 1024 ) {
43
- s = String .format ("%.2f" , kb ) + " KB" ;
44
- } else if (size < 1024 * 1024 * 1024 ) {
45
- s = String .format ("%.2f" , mb ) + " MB" ;
40
+ return size + " Bytes" ;
41
+ }
42
+
43
+ double kb = size / 1024.0 ;
44
+ if (kb < 1024 ) {
45
+ return String .format ("%.2f KB" , kb );
46
46
}
47
- return s ;
47
+
48
+ double mb = kb / 1024.0 ;
49
+ return String .format ("%.2f MB" , mb );
48
50
}
49
51
50
52
public static Bitmap preProcessBitmap (Bitmap bitmap ) {
51
- bitmap = bitmap .copy (Bitmap .Config .ARGB_8888 , true );
52
- Pix pix = ReadFile .readBitmap (bitmap );
53
- pix = Convert .convertTo8 (pix );
53
+ Pix pix = preparePix (bitmap );
54
54
55
- if (SpUtil .getInstance ().getBoolean (Constants .KEY_CONTRAST , true )) {
56
- // pix=AdaptiveMap.backgroundNormMorph(pix);
55
+ if (shouldApplyContrast ()) {
57
56
pix = AdaptiveMap .pixContrastNorm (pix );
58
57
}
59
58
60
- if (SpUtil . getInstance (). getBoolean ( Constants . KEY_UN_SHARP_MASKING , true ))
59
+ if (shouldApplyUnsharpMasking ()) {
61
60
pix = Enhance .unsharpMasking (pix );
61
+ }
62
62
63
- if (SpUtil . getInstance (). getBoolean ( Constants . KEY_OTSU_THRESHOLD , true ))
63
+ if (shouldApplyOtsuThreshold ()) {
64
64
pix = Binarize .otsuAdaptiveThreshold (pix );
65
+ }
65
66
66
- if (SpUtil .getInstance ().getBoolean (Constants .KEY_FIND_SKEW_AND_DESKEW , true )) {
67
- float f = Skew .findSkew (pix );
68
- pix = Rotate .rotate (pix , f );
67
+ if (shouldFindAndDeskw ()) {
68
+ pix = rotateToCorrectSkew (pix );
69
69
}
70
70
71
71
return WriteFile .writeBitmap (pix );
72
72
}
73
73
74
+ private static Pix preparePix (Bitmap bitmap ) {
75
+ return Convert .convertTo8 (ReadFile .readBitmap (bitmap .copy (Bitmap .Config .ARGB_8888 , true )));
76
+ }
77
+
78
+ private static boolean shouldApplyContrast () {
79
+ return SpUtil .getInstance ().getBoolean (Constants .KEY_CONTRAST , true );
80
+ }
81
+
82
+ private static boolean shouldApplyUnsharpMasking () {
83
+ return SpUtil .getInstance ().getBoolean (Constants .KEY_UN_SHARP_MASKING , true );
84
+ }
85
+
86
+ private static boolean shouldApplyOtsuThreshold () {
87
+ return SpUtil .getInstance ().getBoolean (Constants .KEY_OTSU_THRESHOLD , true );
88
+ }
89
+
90
+ private static boolean shouldFindAndDeskw () {
91
+ return SpUtil .getInstance ().getBoolean (Constants .KEY_FIND_SKEW_AND_DESKEW , true );
92
+ }
93
+
94
+ private static Pix rotateToCorrectSkew (Pix pix ) {
95
+ float skewAngle = Skew .findSkew (pix );
96
+ return Rotate .rotate (pix , skewAngle );
97
+ }
98
+
74
99
public static boolean isPreProcessImage () {
75
100
return SpUtil .getInstance ().getBoolean (Constants .KEY_GRAYSCALE_IMAGE_OCR , true );
76
101
}
@@ -83,10 +108,10 @@ public static String getTrainingDataType() {
83
108
return SpUtil .getInstance ().getString (Constants .KEY_TESS_TRAINING_DATA_SOURCE , "best" );
84
109
}
85
110
86
- public static @ NonNull Set <Language > getTrainingDataLanguages (Context c ) {
87
- return allLangs (c , SpUtil .getInstance ().getStringSet (
88
- c .getString (R .string .key_language_for_tesseract_multi ),
89
- Collections .singleton ("eng" )));
111
+ public static @ NonNull Set <Language > getTrainingDataLanguages (Context context ) {
112
+ return allLangs (context , SpUtil .getInstance ().getStringSet (
113
+ context .getString (R .string .key_language_for_tesseract_multi ),
114
+ Collections .singleton (DEFAULT_LANGUAGE )));
90
115
}
91
116
92
117
public static int getPageSegMode () {
@@ -96,53 +121,54 @@ public static int getPageSegMode() {
96
121
public static void putLastUsedText (String text ) {
97
122
SpUtil .getInstance ().putString (Constants .KEY_LAST_USE_IMAGE_TEXT , text );
98
123
}
99
-
124
+
100
125
public static Map <String , String > getAllParameters () {
101
- return SpUtil .getInstance ().getAllParameters ();
126
+ return SpUtil .getInstance ().getAllParameters ();
102
127
}
103
- public static boolean isExtraParameterSet (){
104
- return SpUtil .getInstance ().getBoolean (Constants .KEY_ADVANCE_TESS_OPTION );
128
+
129
+ public static boolean isExtraParameterSet () {
130
+ return SpUtil .getInstance ().getBoolean (Constants .KEY_ADVANCE_TESS_OPTION );
105
131
}
106
132
107
133
public static String getLastUsedText () {
108
134
return SpUtil .getInstance ().getString (Constants .KEY_LAST_USE_IMAGE_TEXT , "" );
109
135
}
110
136
111
- public static Triple <Set <Language >, Set <Language >, Set <Language >> getLast3UsedLanguage (Context c ) {
137
+ public static Triple <Set <Language >, Set <Language >, Set <Language >> getLast3UsedLanguages (Context context ) {
112
138
return new Triple <>(
113
- allLangs (c , SpUtil .getInstance ().getStringSet (c .getString (R .string .key_language_for_tesseract_multi ), Collections .singleton ("eng" ))),
114
- allLangs (c , SpUtil .getInstance ().getStringSet (Constants .KEY_LAST_USED_LANGUAGE_2 , Collections .singleton ("hin" ))),
115
- allLangs (c , SpUtil .getInstance ().getStringSet (Constants .KEY_LAST_USED_LANGUAGE_3 , Collections .singleton ("deu" )))
139
+ allLangs (context , SpUtil .getInstance ().getStringSet (context .getString (R .string .key_language_for_tesseract_multi ), Collections .singleton (DEFAULT_LANGUAGE ))),
140
+ allLangs (context , SpUtil .getInstance ().getStringSet (Constants .KEY_LAST_USED_LANGUAGE_2 , Collections .singleton ("hin" ))),
141
+ allLangs (context , SpUtil .getInstance ().getStringSet (Constants .KEY_LAST_USED_LANGUAGE_3 , Collections .singleton ("deu" )))
116
142
);
117
143
}
118
144
119
- private static Set <Language > allLangs (Context c , Set <String > codes ) {
120
- return codes .stream ().map (code -> new Language (c , code )).collect (Collectors .toSet ());
145
+ private static Set <Language > allLangs (Context context , Set <String > codes ) {
146
+ return codes .stream ().map (code -> new Language (context , code )).collect (Collectors .toSet ());
121
147
}
122
148
123
- public static void setLastUsedLanguage (Context c , Set <Language > lastUsedLanguage ) {
124
- Set <Language > l1 = getLast3UsedLanguage (c ).getFirst ();
125
- Set <Language > l2 = getLast3UsedLanguage (c ).getSecond ();
126
- if (lastUsedLanguage .equals (l1 )) {
127
- return ;
149
+ public static void setLastUsedLanguage (Context context , Set <Language > lastUsedLanguage ) {
150
+ Set <Language > lastLanguage1 = getLast3UsedLanguages (context ).getFirst ();
151
+ Set <Language > lastLanguage2 = getLast3UsedLanguages (context ).getSecond ();
152
+
153
+ if (lastUsedLanguage .equals (lastLanguage1 )) {
154
+ return ;
128
155
}
156
+
129
157
Set <String > lastCodes = lastUsedLanguage .stream ().map (Language ::getCode ).collect (Collectors .toSet ());
130
- Set <String > l1Codes = l1 .stream ().map (Language ::getCode ).collect (Collectors .toSet ());
131
- Set <String > l2Codes = l2 .stream ().map (Language ::getCode ).collect (Collectors .toSet ());
132
- if (l2 .equals (lastUsedLanguage )) {
133
- SpUtil .getInstance ().putStringSet (Constants .KEY_LAST_USED_LANGUAGE_2 , l1Codes );
134
- SpUtil .getInstance ().putStringSet (c .getString (R .string .key_language_for_tesseract_multi ), lastCodes );
158
+ Set <String > lastCodes1 = lastLanguage1 .stream ().map (Language ::getCode ).collect (Collectors .toSet ());
159
+ Set <String > lastCodes2 = lastLanguage2 .stream ().map (Language ::getCode ).collect (Collectors .toSet ());
160
+
161
+ if (lastLanguage2 .equals (lastUsedLanguage )) {
162
+ SpUtil .getInstance ().putStringSet (Constants .KEY_LAST_USED_LANGUAGE_2 , lastCodes1 );
163
+ SpUtil .getInstance ().putStringSet (context .getString (R .string .key_language_for_tesseract_multi ), lastCodes );
135
164
} else {
136
- SpUtil .getInstance ().putStringSet (Constants .KEY_LAST_USED_LANGUAGE_3 , l2Codes );
137
- SpUtil .getInstance ().putStringSet (Constants .KEY_LAST_USED_LANGUAGE_2 , l1Codes );
138
- SpUtil .getInstance ().putStringSet (c .getString (R .string .key_language_for_tesseract_multi ), lastCodes );
165
+ SpUtil .getInstance ().putStringSet (Constants .KEY_LAST_USED_LANGUAGE_3 , lastCodes2 );
166
+ SpUtil .getInstance ().putStringSet (Constants .KEY_LAST_USED_LANGUAGE_2 , lastCodes1 );
167
+ SpUtil .getInstance ().putStringSet (context .getString (R .string .key_language_for_tesseract_multi ), lastCodes );
139
168
}
140
-
141
169
}
142
170
143
171
public static void putLastUsedImageLocation (String imageURI ) {
144
172
SpUtil .getInstance ().putString (Constants .KEY_LAST_USE_IMAGE_LOCATION , imageURI );
145
173
}
146
-
147
-
148
174
}
0 commit comments