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

如题:

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";

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

时间: 2024-12-13 00:07:48

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

过滤ASCII码中的不可见字符, ASCII三部分, 各控制字符详解

今天产品部同事报告了一个BUG,经过调试发现,由于用户输入的字符串中,包含字符0x1E, 也就是”记录分隔符”(Record Separator, Notepad++ 显示为[RS]),导致JavaScript XML解析遭遇错误.于是就想在字符串中过滤掉这些没多大用途的字符,同时又要保留部分常用的字符,例如换行,回车和水平制表符.于是写了下面一个 PHP 函数: /** * 清理字符串中的部分不可见控制字符 * * @param string $string 待处理字符串 * @return

PHP根据ASCII码返回具体的字符

根据ASCII码返回具体的字符,在php中可以使用函数 chr(); 如:大写字母A的 ASCII码是 65, 所以: <?php echo chr(65);//结果是大写字母 A ?> 提示:(常用的ASCII码) 数字0-9: 48-57 小写字母a-z:97-122 大写字母A-Z: 65-90 更多的信息可以到这里去查找:http://ascii.911cha.com/ 而对于的根据字符返回对于的ASCII码的方法是 ord();

如何用C语言显示ascii码超过127的字符

C语言的程序代码如下: #include "stdio.h"main(){      int i;      for (i=1;i<256;i++)          {              printf("%c ",i);          }          getchar();} 显示结果: 编码在127以上的都显示为"?". 这是因为 编号在128-255的是扩展的编码,原本就不是作为显示用的,当然在不同的终端上显示就不一致

ABBYY FineReader窗口中不显示字符怎样解决

ABBYY FineReader是一款OCR文字识别软件,使用ABBYY FineReader可以识别阿拉伯语.希伯来语.意第绪语.泰国语.中文.日语和韩语文档.但是,如果文本窗口中有错误显示的CJK语言,表示可能选择了纯文本模式,可能会出现"文本"窗口中不显示非欧洲字符,此时需要更改纯文本下使用的字体,那么具体该如何操作呢? 查看更多内容可前往:http://www.abbyychina.com/FRshiyongjiqiao/abbyyfr-feiouzhouzifu.html 步

在Qt中怎样显示ASCII码大于127的字符

前段时间要显示“≤”符号找了挺久没找到方法,后面发现用以下方法可以解决: ushort gd[]={8805,0};    QString gteq=QString::fromUtf16(gd); 得到的gteq就是“≤”: 函数:QString::fromUtf16(const ushort* unicode,int size=-1): 参数  unicode:是我们要的字符串对应的unicode码数组: 参数  size:       是数组的长度,如果没有指定长度则要以0结束: 那怎么知道

Android安全-数据安全1-代码中的字符串安全

Android 应用程序开发中难免会使用到字符串,如服务器的地址等一些敏感信息,对于这些字符串如果使用硬编码的方式,容易通过静态分析获取,甚至可以使用自动化分析工具批量提取.例如若在 Java 源代码中定义一个字符串如下: 代码: 1. String str = "I am a string!"; 则在反编译的.smali 代码中对应的代码如下(寄存器可能会有区别): 代码: 1. const-string v0, "I am a string!" 对于自动化分析工

html-中文字体在CSS中的显示(Unicode编码)(转载)

为了方便需要的朋友快速使用,下表中列出了一些常用中文字体的Unicode编码: 宋体                   SimSun     \5B8B\4F53黑体                   SimHei     \9ED1\4F53微软雅黑            Microsoft YaHei     \5FAE\8F6F\96C5\9ED1微软正黑体         Microsoft JhengHei     \5FAE\x8F6F\6B63\9ED1\4F53新宋体   

SqlSever基础 char函数 由ASCII码值返回一个字符

镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ 1 code 1 --已知一个字符的ASCII值,求他的字符 2 select char (97) 2 show ------------------------------------------博文的精髓,在技术部分,更在镇场一诗.SqlSever是优秀的语言,值得努力学习.熟悉数据库的增删查

在低于android 5.0的版本中ActionBar不显示

我从ABS切换到AppCompat与Material theme(仅适用于API21) 我的配置文件如下: <application android:theme="@style/AppStyle" <-- values folder --> <style name="AppStyle" parent="@style/AudioRecTheme"> <style name="AudioRecTheme&