文档章节

Android默认字体ASCII码中可显示字符的平均灰度由小到大排序

千里山南
 千里山南
发布于 2014/08/11 12:47
字数 595
阅读 571
收藏 1

如题:

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

package com.example.test;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.FontMetrics;
import android.util.AttributeSet;
import android.view.View;

public class CharView extends View{
	private Paint mPaint;
	private char mChar;
	private int mTextSize;
	private FontMetrics mFm = new FontMetrics();
	private Canvas mDrawCanvas = new Canvas();
	
	public CharView(Context context, AttributeSet attrs) {
		this(context, attrs, -1);
	}

	public CharView(Context context) {
		this(context, null, -1);
	}
	
	public CharView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		mPaint = new Paint();
		mPaint.setColor(Color.RED);
	}
	
	public void setChar(char c) {
		mChar = c;
		mTextSize = measureChar(c, getMeasuredWidth());
		invalidate();
	}
	
	private int measureChar(char c, int maxWidth) {
		int result = 0;
		for (int i = 0; i < maxWidth * 2; i++) {
			mPaint.setTextSize(i);
			int textSize = (int)mPaint.measureText(String.valueOf(c));
			mPaint.getFontMetrics(mFm);
			int textHeight = (int)(mFm.bottom - mFm.top);
			if (textSize > maxWidth || textHeight > maxWidth) {
				result = i;
				break;
			}
		}
		return result;
	}
	
	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);
		drawInner(canvas);
	}
	
	private void drawInner(Canvas canvas) {
		if (mTextSize == 0) {
			mTextSize = measureChar(mChar, getMeasuredWidth());
		}
		mPaint.setTextSize(mTextSize);
		mPaint.getFontMetrics(mFm);
		int baseHeight = -(int)mFm.top;
		int x = (int)(getMeasuredWidth() - mPaint.measureText(String.valueOf(mChar))) / 2;
//		canvas.drawLine(0, baseHeight+mFm.ascent, 500, baseHeight+mFm.ascent, mPaint);
//		canvas.drawLine(0, baseHeight, 500, baseHeight, mPaint);
//		canvas.drawLine(0, baseHeight+mFm.descent, 500, baseHeight+mFm.descent, mPaint);
//		canvas.drawLine(0, baseHeight+mFm.bottom, 500, baseHeight+mFm.bottom, mPaint);
		canvas.drawText(String.valueOf(mChar), x, baseHeight, mPaint);
	}
	
	public void drawBitmap(Bitmap bitmap) {
		bitmap.eraseColor(Color.TRANSPARENT);
		mDrawCanvas.setBitmap(bitmap);
		drawInner(mDrawCanvas);
	}
}

@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());
	}
	
	private float calAverageGray(Bitmap b) {
		int width = b.getWidth();
		int height = b.getHeight();
		int noneWhiteCount = 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);
//				Log.d("Pix", "pos = "+"("+"j, "+"i"+")"+"rgb = "+r+", "+g+" , "+bl);
				if (r > 100) {
					noneWhiteCount++;
				}
			}
		}
		return noneWhiteCount / (float)(width * height);
	}
	
	private Map<Integer, Character> results = new HashMap<Integer, Character>();
	private Bitmap mBitmap;
@Override
	public void onClick(View v) {
		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();
		int dimen = 10;
		int dimenY = (int)(height / (float)width * dimen);
		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < height; i+= dimen) {
			for (int j = 0; j < width; j+= dimenY) {
				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();
				if (averGray < 128) {
					int pos = (int)((128 - averGray) / 128f * dicCount);
					pos = pos > dicCount - 1 ? dicCount - 1 : pos;
					int charInt = Integer.decode(dics[pos]);
					sb.append((char)charInt);
				} else {
					sb.append(' ');
				}
			}
			sb.append("\n");
		}
		
		Log.e("HA", sb.toString());
	}
	
	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);
	}
	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";


© 著作权归作者所有

千里山南
粉丝 8
博文 26
码字总数 8030
作品 1
合肥
私信 提问
Android 浅谈 maxEms 属性

小菜最近调整一个小需求,为了整体显示效果,需要限制一部分文字的长度,超过部分以...代替。 小菜本想偷个懒,用 android:maxLength="6" 属性配合 android:maxLines="1" 以及 android:elli...

阿策神奇
2018/05/12
0
0
C语言自学完备手册(23)——字符

版权声明: https://blog.csdn.net/lfdfhl/article/details/82905818 自定义View系列教程00–推翻自己和过往,重学自定义View 自定义View系列教程01–常用工具介绍 自定义View系列教程02–o...

谷哥的小弟
2018/09/30
0
0
Android EditText

EditText继承关系:View-->TextView-->EditText   EditText的属性很多,这里介绍几个: android:hint="请输入数字!"//设置显示在空间上的提示信息 android:numeric="integer"//设置只能输......

amigos_wu
2012/06/20
876
0
EditText 集锦 - 开发中常用的用法及遇到的各种坑

前言 EditText ,文本输入框,一个再熟悉不过的的控件,在开发当中,我们需要经常用到。这边文章,主要是记录 EditText 的常用用法,需要的时候可以直接复制张贴,提高效率。同时,本文章会持...

xujun9411
02/21
0
0
Android studio常用设置详解

1.1 界面设置 默认的 Android Studio 为灰色界面,可以选择使用炫酷的黑色界面。 Settings --> Appearance --> Theme ,选择 Darcula 主题即可。 1.2 字体设置 如果你的Android Studio界面中...

dailei1021
2015/11/05
274
0

没有更多内容

加载失败,请刷新页面

加载更多

正则表达式匹配

请实现一个函数用来匹配包括 '.' 和 '*' 的正则表达式。模式中的字符 '.' 表示任意一个字符,而 '*' 表示它前面的字符可以出现任意次(包含 0 次)。 在本题中,匹配是指字符串的所有字符匹配...

Garphy
今天
7
0
Laravel 5.1的多路由文件的配置

默认的路由配置文件只有一个, \app\Http\routes.php。 在同一个文件中写路由容易起冲突,文件会越来越大,就需要定义多个路由文件。 找到加载\app\Http\routes.php的文件, 打开\app\Provid...

mdoo
今天
5
0
Hibernate 5 开始使用指南前言

同时在面向对象软件和关系型数据库进行工作,可能会非常复杂和费时。数据在对象和数据库之间可能会不一致,然后导致开发成本会非常高。 Hibernate 是一个针对 Java 环境的对象关系映射(Obj...

honeymoose
今天
6
0
聊聊nacos ServiceManager的UpdatedServiceProcessor

序 本文主要研究一下nacos ServiceManager的UpdatedServiceProcessor ServiceManager.init nacos-1.1.3/naming/src/main/java/com/alibaba/nacos/naming/core/ServiceManager.java @Compone......

go4it
今天
7
0
正则表达式的使用(QQ格式的判断与空格的切割)

//正则表达式的使用 public static void main(String[] args) throws IOException, ClassNotFoundException { //test1("123456"); test2("-1 99 kk"); } /** * ......

zhengzhixiang
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部