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

Stella981
• 阅读 495

如题:

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";
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
java将前端的json数组字符串转换为列表
记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这