@Override
public void onClick(View v) {
// if (mBitmap == null) {
// mBitmap = Bitmap.createBitmap(mCharView.getMeasuredWidth(), mCharView.getMeasuredHeight(), Bitmap.Config.ARGB_8888);
// }
// for (int i = 33; i < 127; i++) {
// char c = (char)i;
// mCharView.setChar(c);
// mCharView.drawBitmap(mBitmap);
// int averGray = (int)(calAverageGray(mBitmap) * 100000);
// results.put(averGray, c);
// }
//
// List<Integer> floats = new ArrayList<Integer>();
// floats.addAll(results.keySet());
// Collections.sort(floats);
// StringBuilder sb = new StringBuilder();
// for (Integer f : floats) {
// Log.d("Result", results.get(f)+" : "+f);
// sb.append(String.valueOf((int)results.get(f))).append(",");
// }
// Log.d("Result", "result = "+sb.toString());
String[] dics = dic.split(",");
int dicCount = dics.length;
File file = new File(Environment.getExternalStorageDirectory(), "test.jpg");
Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());
int width = bitmap.getWidth();
int height = bitmap.getHeight();
Bitmap dest = Bitmap.createBitmap(width * 2, height * 2, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(dest);
Paint paint = new Paint();
paint.setTextSize(8);
float textsize = paint.measureText("W");
float textHeight = paint.descent() - paint.ascent();
float textPosY = - paint.ascent();
float textPosX = - 0;
// int dimen = 4;
// int dimenY = (int)(dimen * 2.23f);
int dimen = (int)textsize / 2;
int dimenY = (int)textHeight / 2;
StringBuilder sb = new StringBuilder();
for (int i = 0; i < height; i+= dimenY) {
for (int j = 0; j < width; j+= dimen) {
int w = dimen > width - j ? width - j : dimen;
int h = dimenY > height - i ? height - i : dimenY;
Bitmap temp = Bitmap.createBitmap(bitmap, j, i, w, h);
float averGray = calAverageGray(temp);
temp.recycle();
int threshold = 180;
if (averGray < threshold) {
int pos = (int)((threshold - averGray) / (float)threshold * dicCount);
pos = pos > dicCount - 1 ? dicCount - 1 : pos;
int charInt = Integer.decode(dics[pos]);
sb.append((char)charInt);
canvas.drawText(String.valueOf((char)charInt), textPosX, textPosY, paint);
} else {
sb.append(' ');
}
textPosX += textsize;
}
textPosY += textHeight;
textPosX = 0;
sb.append("\n");
}
saveBitmapToFile(dest, Environment.getExternalStorageDirectory().getAbsolutePath(), "dest.png", true, false);
Log.e("HA", sb.toString());
((TextView)findViewById(R.id.mytext)).setText(sb.toString());
File file2 = new File(Environment.getExternalStorageDirectory(), "test.txt");
BufferedWriter bw = null;
try {
bw = new BufferedWriter(new FileWriter(file2));
bw.write(sb.toString());
bw.flush();
} catch (IOException e) {
} finally {
if (bw != null) {
try {bw.close();}catch(Exception e){};
}
}
}
private float calAverageGray(Bitmap b) {
int width = b.getWidth();
int height = b.getHeight();
float grayCount = 0;
for(int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
int color = b.getPixel(j, i);
int r = Color.red(color);
int g = Color.green(color);
int bl = Color.blue(color);
grayCount +=(r * 19595 + g * 38469 + bl * 7472) >> 16;
}
}
return grayCount / (width * height);
}
/**
* 保存bitmap到文件中,由于不知道当前bitmap的格式,可能导致保存后文件变大或变小,慎重使用
* @param bitmap
* @param path
* @param name
* @param isHighDefinition png或jpg存储
* @param recycleSelf 是否释放该位图
*/
public static void saveBitmapToFile(Bitmap bitmap, String path, String name, boolean isHighDefinition, boolean recycleSelf) {
File file = new File(path);
if (!file.exists()) {
file.mkdirs();
}
File imageFile = new File(file, name);
// 如果文件已经存在,则不继续保存
if (imageFile.exists()) {
return;
}
FileOutputStream fos = null;
try {
imageFile.createNewFile();
fos = new FileOutputStream(imageFile);
// TODO 后续可以根据分辨率来保存不同图片质量
if (isHighDefinition) {
bitmap.compress(CompressFormat.PNG, 100, fos);
} else {
bitmap.compress(CompressFormat.JPEG, 50, fos);
}
} catch (FileNotFoundException e) {
} catch (IOException e) {
} finally {
if (fos != null) {
try {
fos.flush();
} catch (IOException e) {
}
try {
fos.close();
} catch (IOException e) {
}
}
}
}
private Map<Integer, Character> results = new HashMap<Integer, Character>();
private Bitmap mBitmap;
private String dic = "46,96,39,58,45,44,59,34,95,126,33,94,105,114,124,47,73,61,60,62,42,108,92,49,116,43,106,63,118,41,40,76,102,123,55,125,74,84,99,120,122,93,91,117,110,115,89,111,70,121,101,50,97,86,107,51,104,90,67,52,80,53,65,113,88,112,69,37,48,85,100,98,54,75,83,57,35,72,119,71,36,79,103,68,56,82,81,109,66,38,78,87,77,64";