如题:
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
1package com.example.test; 2 3import android.content.Context; 4import android.graphics.Bitmap; 5import android.graphics.Canvas; 6import android.graphics.Color; 7import android.graphics.Paint; 8import android.graphics.Paint.FontMetrics; 9import android.util.AttributeSet; 10import android.view.View; 11 12public class CharView extends View{ 13 private Paint mPaint; 14 private char mChar; 15 private int mTextSize; 16 private FontMetrics mFm = new FontMetrics(); 17 private Canvas mDrawCanvas = new Canvas(); 18 19 public CharView(Context context, AttributeSet attrs) { 20 this(context, attrs, -1); 21 } 22 23 public CharView(Context context) { 24 this(context, null, -1); 25 } 26 27 public CharView(Context context, AttributeSet attrs, int defStyle) { 28 super(context, attrs, defStyle); 29 mPaint = new Paint(); 30 mPaint.setColor(Color.RED); 31 } 32 33 public void setChar(char c) { 34 mChar = c; 35 mTextSize = measureChar(c, getMeasuredWidth()); 36 invalidate(); 37 } 38 39 private int measureChar(char c, int maxWidth) { 40 int result = 0; 41 for (int i = 0; i < maxWidth * 2; i++) { 42 mPaint.setTextSize(i); 43 int textSize = (int)mPaint.measureText(String.valueOf(c)); 44 mPaint.getFontMetrics(mFm); 45 int textHeight = (int)(mFm.bottom - mFm.top); 46 if (textSize > maxWidth || textHeight > maxWidth) { 47 result = i; 48 break; 49 } 50 } 51 return result; 52 } 53 54 @Override 55 protected void onDraw(Canvas canvas) { 56 super.onDraw(canvas); 57 drawInner(canvas); 58 } 59 60 private void drawInner(Canvas canvas) { 61 if (mTextSize == 0) { 62 mTextSize = measureChar(mChar, getMeasuredWidth()); 63 } 64 mPaint.setTextSize(mTextSize); 65 mPaint.getFontMetrics(mFm); 66 int baseHeight = -(int)mFm.top; 67 int x = (int)(getMeasuredWidth() - mPaint.measureText(String.valueOf(mChar))) / 2; 68// canvas.drawLine(0, baseHeight+mFm.ascent, 500, baseHeight+mFm.ascent, mPaint); 69// canvas.drawLine(0, baseHeight, 500, baseHeight, mPaint); 70// canvas.drawLine(0, baseHeight+mFm.descent, 500, baseHeight+mFm.descent, mPaint); 71// canvas.drawLine(0, baseHeight+mFm.bottom, 500, baseHeight+mFm.bottom, mPaint); 72 canvas.drawText(String.valueOf(mChar), x, baseHeight, mPaint); 73 } 74 75 public void drawBitmap(Bitmap bitmap) { 76 bitmap.eraseColor(Color.TRANSPARENT); 77 mDrawCanvas.setBitmap(bitmap); 78 drawInner(mDrawCanvas); 79 } 80} 81 82@Override 83 public void onClick(View v) { 84 if (mBitmap == null) { 85 mBitmap = Bitmap.createBitmap(mCharView.getMeasuredWidth(), mCharView.getMeasuredHeight(), Bitmap.Config.ARGB_8888); 86 } 87 for (int i = 33; i < 127; i++) { 88 char c = (char)i; 89 mCharView.setChar(c); 90 mCharView.drawBitmap(mBitmap); 91 int averGray = (int)(calAverageGray(mBitmap) * 100000); 92 results.put(averGray, c); 93 } 94 95 List<Integer> floats = new ArrayList<Integer>(); 96 floats.addAll(results.keySet()); 97 Collections.sort(floats); 98 StringBuilder sb = new StringBuilder(); 99 for (Integer f : floats) { 100 Log.d("Result", results.get(f)+" : "+f); 101 sb.append(String.valueOf((int)results.get(f))).append(","); 102 } 103 Log.d("Result", "result = "+sb.toString()); 104 } 105 106 private float calAverageGray(Bitmap b) { 107 int width = b.getWidth(); 108 int height = b.getHeight(); 109 int noneWhiteCount = 0; 110 for(int i = 0; i < height; i++) { 111 for (int j = 0; j < width; j++) { 112 int color = b.getPixel(j, i); 113 int r = Color.red(color); 114 int g = Color.green(color); 115 int bl = Color.blue(color); 116// Log.d("Pix", "pos = "+"("+"j, "+"i"+")"+"rgb = "+r+", "+g+" , "+bl); 117 if (r > 100) { 118 noneWhiteCount++; 119 } 120 } 121 } 122 return noneWhiteCount / (float)(width * height); 123 } 124 125 private Map<Integer, Character> results = new HashMap<Integer, Character>(); 126 private Bitmap mBitmap; 127 128@Override 129 public void onClick(View v) { 130 String[] dics = dic.split(","); 131 int dicCount = dics.length; 132 File file = new File(Environment.getExternalStorageDirectory(), "test.jpg"); 133 Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath()); 134 int width = bitmap.getWidth(); 135 int height = bitmap.getHeight(); 136 int dimen = 10; 137 int dimenY = (int)(height / (float)width * dimen); 138 StringBuilder sb = new StringBuilder(); 139 for (int i = 0; i < height; i+= dimen) { 140 for (int j = 0; j < width; j+= dimenY) { 141 int w = dimen > width - j ? width - j : dimen; 142 int h = dimenY > height - i ? height - i : dimenY; 143 Bitmap temp = Bitmap.createBitmap(bitmap, j, i, w, h); 144 float averGray = calAverageGray(temp); 145 temp.recycle(); 146 if (averGray < 128) { 147 int pos = (int)((128 - averGray) / 128f * dicCount); 148 pos = pos > dicCount - 1 ? dicCount - 1 : pos; 149 int charInt = Integer.decode(dics[pos]); 150 sb.append((char)charInt); 151 } else { 152 sb.append(' '); 153 } 154 } 155 sb.append("\n"); 156 } 157 158 Log.e("HA", sb.toString()); 159 } 160 161 private float calAverageGray(Bitmap b) { 162 int width = b.getWidth(); 163 int height = b.getHeight(); 164 float grayCount = 0; 165 for(int i = 0; i < height; i++) { 166 for (int j = 0; j < width; j++) { 167 int color = b.getPixel(j, i); 168 int r = Color.red(color); 169 int g = Color.green(color); 170 int bl = Color.blue(color); 171 grayCount +=(r * 19595 + g * 38469 + bl * 7472) >> 16; 172 } 173 } 174 return grayCount / (width * height); 175 } 176 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";