牛逼的绘图方式抓取中文字的点阵编码

String byteToString = "";
        //将19968到40869的汉字都搞一遍.
        for (int i = 19968; i < 40869; i++) {
            byte byte1 = (byte) (224 + (i >> 12));
            byte byte2 = (byte) ((i >> 6 & 0x3f) + 128);
            byte byte3 = (byte) ((i & 0x3f) + 128);
            byte[] bytes = { byte1, byte2, byte3 };
//因为utf8中, 汉字是3个byte的, 这3个byte有特定的编码方法, 在wiki上可以查到, 简单说就是110xxxxx, 1xxxxxxx ,1xxxxxxx
            try {
                byteToString = new String(bytes, "UTF8");

//将上面的3个byte, 生成一个汉字的String
            } catch (UnsupportedEncodingException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            jpanel.changeText(byteToString);
            System.out.println(byteToString);

jpanel.updateUI();

//刷新jpanel, 把汉字写上去
            try {
                Thread.sleep(1000);

//睡1秒, 刷汉字需要时间
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            captureImage();

//截图

try {
                Thread.sleep(1000);

//分析也是需要时间的.
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            // checkBMP();

String resultStr = i + " " + byteToString + " " + checkBMP();

//分析.

try {
                write2file.write2File(resultStr);

//分析完之后, 写文件.
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

把上面的代码放在一个init()方法中, 就可以自动开始工作了, 搞20000多个汉字, 用了十几个小时.

截图的方法:

public void captureImage() {
        fullScreenImage = robot.createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()));
        pickedImage = fullScreenImage.getSubimage(508, 516, 16, 16);
        try {
            ImageIO.write(pickedImage, "bmp", new File("c:\\temp\\temp.bmp"));
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

分析bmp:

public String checkBMP() {
        try {
            FileInputStream fs = new FileInputStream(new File("c:\\temp\\temp.bmp"));
            int bflen = 14; // 14 byte BITMAPFILEHEADER
            byte bf[] = new byte[bflen];
            fs.read(bf, 0, bflen);
            int bilen = 40; // 40-byte BITMAPINFOHEADER
            byte bi[] = new byte[bilen];
            fs.read(bi, 0, bilen);
            // Interperet data.
            // int nsize = (((int) bf[5] & 0xff) << 24) | (((int) bf[4] & 0xff)
            // << 16) | (((int) bf[3] & 0xff) << 8) | (int) bf[2] & 0xff;
            // System.out.println("File type is :" + (char) bf[0] + (char)
            // bf[1]);
            // System.out.println("Size of file is :" + nsize);

// Head info data
            // int nbisize = (((int) bi[3] & 0xff) << 24) | (((int) bi[2] &
            // 0xff) << 16) | (((int) bi[1] & 0xff) << 8) | (int) bi[0] & 0xff;
            // System.out.println("Size of bitmapinfoheader is :" + nbisize);

int nwidth = (((int) bi[7] & 0xff) << 24) | (((int) bi[6] & 0xff) << 16) | (((int) bi[5] & 0xff) << 8) | (int) bi[4] & 0xff;
            // System.out.println("Width is :" + nwidth);

int nheight = (((int) bi[11] & 0xff) << 24) | (((int) bi[10] & 0xff) << 16) | (((int) bi[9] & 0xff) << 8) | (int) bi[8] & 0xff;
            // System.out.println("Height is :" + nheight);

// // number of planes in this bitmap
            // int nplanes = (((int) bi[13] & 0xff) << 8) | (int) bi[12] & 0xff;
            // System.out.println("Planes is :" + nplanes);
            int originalBRGArray[][] = new int[nheight][nwidth];
            //
            // int nbitcount = (((int) bi[15] & 0xff) << 8) | (int) bi[14] &
            // 0xff;
            // System.out.println("BitCount is :" + nbitcount);
            //
            // // Look for non-zero values to indicate compression
            // int ncompression = (((int) bi[19]) << 24) | (((int) bi[18]) <<
            // 16) | (((int) bi[17]) << 8) | (int) bi[16];
            // System.out.println("Compression is :" + ncompression);
            //
            int nsizeimage = (((int) bi[23] & 0xff) << 24) | (((int) bi[22] & 0xff) << 16) | (((int) bi[21] & 0xff) << 8) | (int) bi[20] & 0xff;
            // System.out.println("SizeImage is :" + nsizeimage);

// int nxpm = (((int) bi[27] & 0xff) << 24) | (((int) bi[26] & 0xff)
            // << 16) | (((int) bi[25] & 0xff) << 8) | (int) bi[24] & 0xff;
            // System.out.println("X-Pixels per meter is :" + nxpm);
            //
            // int nypm = (((int) bi[31] & 0xff) << 24) | (((int) bi[30] & 0xff)
            // << 16) | (((int) bi[29] & 0xff) << 8) | (int) bi[28] & 0xff;
            // System.out.println("Y-Pixels per meter is :" + nypm);

// int nclrused = (((int) bi[35] & 0xff) << 24) | (((int) bi[34] &
            // 0xff) << 16) | (((int) bi[33] & 0xff) << 8) | (int) bi[32] &
            // 0xff;
            // System.out.println("Colors used are :" + nclrused);

// int nclrimp = (((int) bi[39] & 0xff) << 24) | (((int) bi[38] &
            // 0xff) << 16) | (((int) bi[37] & 0xff) << 8) | (int) bi[36] &
            // 0xff;
            // System.out.println("Colors important are :" + nclrimp);
            // if (nsizeimage == 0) {
            // nsizeimage = ((((nwidth * nbitcount) + 31) & ~31) >> 3);
            // nsizeimage *= nheight;
            // System.out.println("nsizeimage (backup) is" + nsizeimage);
            // }
            int npad = (nsizeimage / nheight) - nwidth * 3;
            int ndata[] = new int[nheight * nwidth];

byte brgb[] = new byte[(nwidth + npad) * 3 * nheight];
            fs.read(brgb, 0, (nwidth + npad) * 3 * nheight);
            int nindex = 0;
            for (int j = 0; j < nheight; j++) {
                for (int i = 0; i < nwidth; i++) {
                    ndata[nwidth * (nheight - j - 1) + i] = (255 & 0xff) << 24 | (((int) brgb[nindex + 2] & 0xff) << 16)
                            | (((int) brgb[nindex + 1] & 0xff) << 8) | (int) brgb[nindex] & 0xff;

// System.out.println("Encoded Color at (" + i + "," + j
                    // + ")is:" + " (R,G,B)= (" + ((int) (brgb[nindex + 2])
                    // & 0xff) + ","
                    // + ((int) brgb[nindex + 1] & 0xff) + "," + ((int)
                    // brgb[nindex] & 0xff) + ")");
                    if (((int) brgb[nindex] & 0xff) > 128) {
                        originalBRGArray[i][j] = 0;
                    } else {
                        originalBRGArray[i][j] = 1;
                    }
                    // System.out.println("orignalBRGArray i:" + i + " j:" + j +
                    // " is: " + originalBRGArray[i][j]);

nindex += 3;
                }
                nindex += npad;
            }
            String resultString = transferArray(originalBRGArray);

fs.close();
            return resultString;
        } catch (Exception e) {
            e.printStackTrace(System.out);
            System.out.println("Caught exception in loadbitmap!");
        }
        return null;

}

编码成每4个点用一个byte来表示亮跟灭:

private String transferArray(int originalBRGArray[][]) {
        Byte[] bytes = new Byte[16 * 4];
        int byteIndex = 0;
        StringBuffer tmp = new StringBuffer();
        for (int k = 0; k < 16 * 4; k++) {
            int columnIndex = k / 4;
            // System.out.println("columnIndex=" + columnIndex);
            int rowIndex = (k % 4) * 4;

int a = originalBRGArray[columnIndex][15 - rowIndex];
            int b = originalBRGArray[columnIndex][14 - rowIndex];
            int c = originalBRGArray[columnIndex][13 - rowIndex];
            int d = originalBRGArray[columnIndex][12 - rowIndex];
            // bytes[k] = (byte) (a + b * 2 + c * 4 + d * 8);
            int byteEachAddress = a + b * 2 + c * 4 + d * 8;
            // System.out.println("a b c d = " + a + " " + b + " " + c + " " +
            // d);
            // System.out.println("bytes[" + k + "] is " + bytes[k]);
            tmp.append(Integer.toHexString(byteEachAddress));
        }

// String[] resultStrArray = new String[16 * 4];
        // System.out.println(tmp);
        // String resultString = swapString(tmp.toString());
        String resultString = tmp.toString();
        System.out.println("BMP data is " + resultString + " after transferred");
        // return resultString;
        return resultString;
    }

有个值得注意的是bmp的编码是从最下面的一行开始记录的, 往上走的, 所以row0其实是最下面的一行.column倒是很老实.

写汉字的方法:

protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.BLACK);
        g.setFont(new Font("simsun", Font.PLAIN, 16));
        g.drawString(textBeenDraw, 100, 100);
        // bmpParse.Reader(g);
        // bmpParse.loadbitmap(g);
}

时间: 2024-11-04 20:49:48

牛逼的绘图方式抓取中文字的点阵编码的相关文章

实例:使用puppeteer headless方式抓取JS网页

puppeteer google chrome团队出品的puppeteer 是依赖nodejs和chromium的自动化测试库,它的最大优点就是可以处理网页中的动态内容,如JavaScript,能够更好的模拟用户. 有些网站的反爬虫手段是将部分内容隐藏于某些javascript/ajax请求中,致使直接获取a标签的方式不奏效.甚至有些网站会设置隐藏元素"陷阱",对用户不可见,脚本触发则认为是机器.这种情况下,puppeteer的优势就凸显出来了. 它可实现如下功能: 生成页面的屏幕截图

httpClient get方式抓取数据

/*     * 爬取网页信息     */    private static String pickData(String url) {        CloseableHttpClient httpclient = HttpClients.createDefault();        try {            HttpGet httpget = new HttpGet(url);            CloseableHttpResponse response = httpcl

Linux 抓取网页方式(curl+wget)

Linux抓取网页,简单方法是直接通过 curl 或 wget 两种命令. curl 和 wget支持协议 curl  支持 http,https,ftp,ftps,scp,telnet等网络协议 wget支持 http,https,ftp网络协议 curl 和 wget抓取实例 抓取网页,主要有url 网址和proxy代理两种方式 1. url 网址方式抓取 (1)curl下载百度首页内容,保存在baidu_html文件中 curl  http://www.baidu.com/  -o  ba

用Python进行网页抓取

引言 从网页中提取信息的需求日益剧增,其重要性也越来越明显.每隔几周,我自己就想要到网页上提取一些信息.比如上周我们考虑建立一个有关各种数据科学在线课程的欢迎程度和意见的索引.我们不仅需要找出新的课程,还要抓取对课程的评论,对它们进行总结后建立一些衡量指标.这是一个问题或产品,其功效更多地取决于网页抓取和信息提取(数据集)的技术,而非以往我们使用的数据汇总技术. 网页信息提取的方式 从网页中提取信息有一些方法.使用API可能被认为是从网站提取信息的最佳方法.几乎所有的大型网站,像Twitter.

记一次企业级爬虫系统升级改造(二):基于AngleSharp实现的抓取服务

爬虫系统升级改造正式启动: 在第一篇文章,博主主要介绍了本次改造的爬虫系统的业务背景与全局规划构思: 未来Support云系统,不仅仅是爬虫系统,是集爬取数据.数据建模处理统计分析.支持全文检索资源库.其他业务部门和公司资讯系统重要数据来源.辅助决策等功能于一身的企业级Support系统. 介于好多园友对博主的任务排期表感兴趣,便介绍一下博主当时针对这个系统做的工作任务排期概要(排期表就是更加详细细分外加估算工时的一份excel表格,就不贴出来了): 1.总分四大阶段,逐步上线,最终达到预期规划

多媒体编程——ios摄像头图像抓取工具类

工具类提供预览图像画面,自动处理旋转,并且以主动方式抓取图像(这样帧率可以无限大) 系统的接口多是异步接收图像,像我这种强迫症怎么受得了,必须吧被动接收图像的方式改成主动抓取. 头文件 #import <Foundation/Foundation.h> #import <AVFoundation/AVFoundation.h> //这些比例都是4:3的比例. typedef enum TKVideoFrameSize { tkVideoFrame480x360 = 480 <

【Hibernate 8】Hibernate的调优方法:抓取策略

在上一篇博客中,介绍了Hibernate的缓存机制.合理的配置缓存,可以极大程度上优化Hibernate的性能.这篇博客,介绍另外一个调优方式:抓取策略. 一.什么是抓取策略 抓取策略(fetching strategy):当应用程序需要在关联关系间进行导航的时候,Hibernate如何获取关联对象的策略.抓取策略可以在O / R映射的元数据中声明,也可以在特定的HQL或条件查询(Criteria Query)中重载声明. 二.Hibernate的抓取策略 在Hibernate中,主要包括四种抓

Requests库抓取数据

安装requests库 pip install requests 1.使用GET方式抓取数据: import requests #导入requests库 url="http://www.cntour.cn/" #需要爬取的网址 strhtml = requests.get(url); #使用GET方式,获取网页数据 print(strhtml.text) #打印html源码 2.使用POST方式抓取数据 网址:有道翻译:http://fanyi.youdao.com/ 按F12 进入开

java抓取动态生成的网页

最近在做项目的时候有一个需求:从网页面抓取数据,要求是首先抓取整个网页的html源码(后期更新要使用到).刚开始一看这个简单,然后就稀里哗啦的敲起了代码(在这之前使用过Hadoop平台的分布式爬虫框架Nutch,使用起来是很方便,但是最后因为速度的原因放弃了,但生成的统计信息在后来的抓取中使用到了),很快holder.html和finance.html页面成功下载完成,然后解析完holder.html页面之后再解析finance.html,然后很沮丧的发现在这个页面中我需要的数据并没有在html