首页 > 其他分享 >牛逼的绘图方式抓取中文字的点阵编码

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

时间:2023-02-22 17:35:12浏览次数:35  
标签:int 抓取 System 0xff 绘图 println byte 点阵 out

 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);
}

标签:int,抓取,System,0xff,绘图,println,byte,点阵,out
From: https://www.cnblogs.com/kn-zheng/p/17145219.html

相关文章

  • matplotlib中如何将图例位置放在绘图区外
    bbox_to_anchor参数可以通过bbox_to_anchor参数将图例放置在坐标系外。bbox表示容纳图例的边界框-boundingboxplt.legend(bbox_to_anchor=(x0,y0,width,height),lo......
  • matplotlib 在多个绘图区绘图
    创建多个画布#2、创建画布#nrows是行数#ncols是列数#1行2列就是横向排列的两个绘图区#2行1列就是纵向排列的两个绘图区#返回图形对象和绘图对象figure,axe......
  • 用python实现数据处理,绘图的综合案例
    首先创建一个类classRecord:def__init__(self,date,order_id,money,province):self.date=date#订单日期self.order_id=order_id#订......
  • charles 抓取抓包手机上的信息||基本使用转发到本地域名
    1.手机设置代理,charles获取信息​​查看​​​​苹果收集抓取https​​2.把手机上连接的地址,转发到本地点击DNSSpooring新增baidu.com指向本地在本地通过nginx域名解......
  • Java文章抓取
    @PostMapping("/grab")@ApiOperationSupport(order=9)@ApiOperation(value="抓取",notes="传入grabUrl")publicRgrabe(@ApiParam(value="抓取",required=true......
  • Qt之2D绘图
    QPaintDevice提供绘图设备,它是一个抽象的二维空间,可以使用QPainter在其上进行绘制;QPaintDevice类是所有可以进行绘制的对象的基类,它的子类主要有QWidget,QPixmap,QImage,QPrint......
  • 抓取过后仍出物体
        首先他是使用了我们的刚体组件的作用  首先我们获取到咱们的物体 要确保他身上有刚体 然后 将iskinematic关闭  然后 给一个方向的力  Tran......
  • 【MATLAB】绘图
    1绘图命令Matlab提供了一些绘图选项,用于确定所绘曲线的线型、颜色和数据点标记符号。这些选项如表所示:线型颜色标记符号- 实线b蓝色.  点s方块: 虚线g绿色o圆圈......
  • 内网渗透-winserver2012抓取明文密码
    问题引入:winserver2012使用mimikatz是无法抓取明文密码的,要获取明文密码需要修改其注册表。法一:在未修改注册表的情况下,使用mimikatz来读取密码:privilege::debugseku......
  • 淘宝抓取终于稳定实现了
    淘宝数据爬取一直是一个不疼但很痒的问题。淘宝有网页版,并不像闲鱼、得物之类的只有App端数据呈现。但淘宝又有厉害到不行的风控和反爬算法,总之想拿淘宝数据,想想很容易,做做......