精华内容
下载资源
问答
  • .net 图片转字符,可选择数字字符中文等模式 源码 .net 图片转字符,可选择数字字符中文等模式 源码 .net 图片转字符,可选择数字字符中文等模式 源码 .net 图片转字符,可选择数字字符中文...
  • 效果是这样的:通过定时器连续显示几幅图片,串联起来看是动的一样,我在网上找了几幅关于小鸡破壳而出那个有趣的场景,然后通过程序实现效果就是小鸡破壳而出。 五张图片如下: 程序主要代码如下: #include...

    qt学习也快一个月了,最近想做一个有趣的程序。效果是这样的:通过定时器连续显示几幅图片,串联起来看像是动的一样,我在网上找了几幅关于小鸡破壳而出那个有趣的场景,然后通过程序实现效果就是小鸡破壳而出。

    五张图片如下:


    程序主要代码如下:

    #include "shapewidget.h"
    #include <QMouseEvent>
    #include <QPainter>
    #include <QPixmap>
    #include <QBitmap>
    
    
    ShapeWidget::ShapeWidget(QWidget *parent) : QWidget(parent)//构造函数的时候显示第一幅图片,并打开定时器
    {
        pix=new QPixmap();
        pix->load(":/images/p1.png",0,Qt::AvoidDither|Qt::ThresholdDither|Qt::ThresholdAlphaDither);
        resize(pix->size());
        setMask(QBitmap(pix->mask()));
    
    
        count=1;
        timer=new QTimer(this);
        timer->start(500);
        connect(timer,SIGNAL(timeout()),this,SLOT(changePicture()));//定时器溢出关联changePicture()函数
    
    
    }
    
    
    ShapeWidget::~ShapeWidget()
    {
    
    
    }
    
    
    void ShapeWidget::changePicture()//使用switch语句根据情况选择不同的图片
    {
        QString picName;
        count=count+1;
        if(count>5) count=1;
        switch(count)
        {
        case 1:picName=":/images/p1.png";break;
        case 2:picName=":/images/p2.png";break;
        case 3:picName=":/images/p3.png";break;
        case 4:picName=":/images/p4.png";break;
        case 5:picName=":/images/p5.png";break;
        default:break;
        }
        pix->load(picName,0,Qt::AvoidDither|Qt::ThresholdDither|Qt::ThresholdAlphaDither);
        resize(pix->size());
        setMask(QBitmap(pix->mask()));//setMask()函数,图片之外透明部分都不显示
        update();	//这句话还是挺重要的,不加和加有很大的区别
    }
    
    
    void ShapeWidget::mousePressEvent(QMouseEvent *event)
    {
        if(event->button()==Qt::LeftButton)
        {
            dragPosition =event->globalPos()-frameGeometry().topLeft();
            event->accept();
        }
        if(event->button()==Qt::RightButton)
        {
           close();
        }
    }
    
    
    void ShapeWidget::mouseMoveEvent(QMouseEvent *event)
    {
        if(event->buttons()&Qt::LeftButton)
        {
            move(event->globalPos()-dragPosition);
            event->accept();
        }
    }
    
    
    void ShapeWidget::paintEvent(QPaintEvent *event)
    {
        QPainter painter(this);
        painter.drawPixmap(0,0,*pix);
    }
    
    
    
    

    遇到的问题:

    1、图片背景改为透明:

    从网上下载的图片背景是白色的,于是用setMask()函数也没用,结果还是会将白色的背景显示出来,于是我用了可牛软件抠图的方法将图片中的对象截取出来了,保存一下为png结尾的文件,呵呵,小鸡的背景终于是透明的了,这下在程序里面可以用setMask()函数了,除了小鸡显示之外,其他窗体、背景什么都不会显示。

    2、资源文件的添加:

    文件-->新建文件或工程-->左下边选择Qt,右边选择Qt资源文件-->取名res,生成一个.qrc文件

    在当前工程文件夹下添加图片资源/images/*.png之类的

    然后你在这个资源文件里面添加前缀,之后添加文件。(前缀改为/,表示.qrc文件的当前目录,如需要引用images/p1.png采用":/images/p1.png")

    资源文件的好处是你编译生成的可执行程序运行时不再需要那些图片资源文件。因为已经被编译成二进制编进可执行程序里面了

    3、生成.exe文件更换图标

    首先当然要准备一个.ico图标文件(假定为desktopIcon.ico,像素16*16,最好本身就是.icon结尾的文件,若不是,编译会提示找不到文件的错误),将其复制到工程目录当中(.pro文件所在的目录)。
    然后在QT Creator中Ctrl+N或 File - New File or Project,选择General中的Text File,名称填写为.rc文件(如deskicon.rc),在里面只用写一行:

    IDI_ICON1ICONDISCARDABLE"desktopIcon.ico"

    编辑.pro文件,里面应该有:OTHER_FILES+= \ qtdemo.rc在其下再添加一行(如果没有上面的内容也没事):
    	RC_FILE = deskicon.rc
    最后编译一下就好了,新生成的exe文件的图标就会变成desktopIcon.ico的样子

    4、Qt应用程序发布

    首先需要以release方式编译应用程序,将编译好的程序文件复制到发布文件夹。 
    其次将以下动态链接库复制到发布文件夹中:mingwm10.dll、QtCore4.dll、QtGui4.dll。可以从“Qt安装目录\qt\bin”下面找到它们。 
    如果用到了其他功能,如OpenGL,则需要将QtOpenGL4.dll也复制到发布文件夹中。 
    如果应用程序有访问数据库的功能,则不仅要将QtSql4.dll复制到发布文件夹,而且还需要将对应的数据库驱动程序(同样也是dll)复制过来,放到“发布文件夹\sqldrivers”目录下面。可以从可以从“Qt安装目录\qt\plugins\sqldrivers”下面找到它们,如qsqlite4.dll。 
    如果应用程序含有中文,还需要在发布文件夹下面建立codecs目录,并将“Qt安装目录\qt\plugins\codecs”目录下面的qcncodecs4.dll复制过来。 
    对于其他以插件方式提供的功能,如imageformats,也需要像上面的方式将所有需要的dll复制过来。 

    我这里引用了C:\Qt\4.7.4\bin文件夹下的mingwm10.dll、QtCore4.dll、QtGui4.dll,后来发现还是缺少libgcc_s_dw2-1.dll,于是再到C:\Qt\4.7.4\bin下将这个链接库复制出来。最后发布程序,OK!

    程序下载地址:http://download.csdn.net/detail/luckywang1103/4887086


    展开全文
  • 基于C8051f340单片机 只要注意引脚 均可以移植到其他型号单片机上,各个子程序方法都是通用的
  • python实现的图片转字符,有趣又好玩,可以自定义DIY自己喜欢的图片字符,还能从中学到一些东西,简单快乐的学习python
  • 图片转字符生成器

    2018-07-20 16:12:43
    图片转字符生成器,抖音字符生成器,一键把图片转换成 字符图形 ASCII Generator 2 简体中文
  • 把一张图片直接转为字符,可以直接运行使用,环境为py3
  • 图片转字符

    2013-06-03 15:11:47
    开源网站上的一个ascgen2软件是用C#写的,但是下载后发现程序包里*.cs文件有全角字符,...ascgen2是一个很好的根据图片生成字符的工具。通过vs2010编译,并下载了语言文件,放在执行目录里,软件启动后为中文界面。
  • 字符实际上是将图片的每一个像素点,按一定的标准(如灰度值等)替换为字符(如图所示,图示为黑色背景,白色字体)。 二、图片转字符 实现过程 ①读取图片(这里使用java.jwt自带的BufferedImage对象读取) ...

    一、实现方法

    字符画实际上是将图片的每一个像素点,按一定的标准(如灰度值等)替换为字符(如图所示,图示为黑色背景,白色字体)。
    示例

    二、图片转字符画 实现过程

    ①读取图片(这里使用java.jwt自带的BufferedImage对象读取)

    	 /** 获取最原生的BufferedImage对象 */
         public static BufferedImage getBufferedImage(final String src) throws FileNotFoundException, IOException {
         		return ImageIO.read(new FileInputStream(new File(src.trim())));
         }
    

    ②对图片进行处理(如压缩、灰度化、二值化等),一般来说,先二值/灰度化后再压缩,效果比较好,当然具体情况具体分析
    灰度化示例
    下面贴上代码

    	/**
     * 按设置的宽度高度比例压缩图片文件,如果width和height都大于0,则以此为基准进行压缩(可能造成图片变型)
     * 
     * @param oldFile
     *            要进行压缩的文件全路径
     * @param newFile
     *            新文件
     * @param width
     *            宽度
     * @param height
     *            高度
     * @return 返回压缩后的文件的全路径
     */
    public static BufferedImage zipImageFileWithRate(BufferedImage image, int width, int height) {
    	if (image == null) {
    		return null;
    	}
    	if(width<=0&&height<=0){
    		return image;
    	}
    	/* 对服务器上的临时文件进行处理 */
    	/* 按比例压缩 */
    	int w = image.getWidth(null);
    	int h = image.getHeight(null);
    	double bili;
    	if (width > 0&&height<=0) {
    		bili = width / (double) w;
    		height = (int) (h * bili);
    	} else if (height > 0&&width<=0) {
    			bili = height / (double) h;
    			width = (int) (w * bili);
    	}
    	
    	BufferedImage buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
    	Graphics2D graphics = buffImg.createGraphics();
    	graphics.getFontRenderContext();
    	graphics.setBackground(new Color(255, 255, 255));
    	graphics.setColor(new Color(255, 255, 255));
    	graphics.fillRect(0, 0, width, height);
    	graphics.drawImage(image.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0, 0, null);
    	StringOutputter.print("压缩图片 (宽:?,高:?)==>成功", width,height);
    	return buffImg;
    }
    
    /**
     * 根据路径获取灰度化后的图片
     */
    public static BufferedImage getGrayBufferedImage(final BufferedImage image)
    		throws FileNotFoundException, IOException {
    	int width = image.getWidth();
    	int height = image.getHeight();
    	BufferedImage grayImage = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY);
    	for (int i = 0; i < width; i++) {
    		for (int j = 0; j < height; j++) {
    			int rgb = image.getRGB(i, j);
    			grayImage.setRGB(i, j, rgb);
    		}
    	}
    	return grayImage;
    }
    /**
     * 获取二值化图片
     */
    public static BufferedImage getBinaryBufferedImage(final BufferedImage image) {
    	if (image == null) {
    		return null;
    	}
    	int width = image.getWidth();
    	int height = image.getHeight();
    	BufferedImage binaryImage = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_BINARY);
    	for (int i = 0; i < width; i++) {
    		for (int j = 0; j < height; j++) {
    			int rgb = image.getRGB(i, j);
    			binaryImage.setRGB(i, j, rgb);
    		}
    	}
    	return binaryImage;
    }
    

    ③遍历图片,根据灰度值,从已知的字符字典里获取字符,并写入txt文件

    		/**
        	 * 获取图片在x,y轴的rgb值
        	 */
        	public static RgbPixel getScreenPixel(BufferedImage image, int x, int y) {
    		if (isLegal(image, x, y)) {
    			RgbPixel rgb = new RgbPixel();
    			int pix = image.getRGB(x, y);
    			rgb.setRed((pix & 0xff0000) >> 16);// 最高8位为Red
    			rgb.setGreen((pix & 0x00ff00) >> 8);// 中间8位为Green
    			rgb.setBlue((pix & 0x0000ff));// 最低8位为Blue
    			return rgb;
    		}
    		return null;
    	}
    	/* 主要实现函数,遍历整张图片 */
        public static void write(BufferedImage image,FileOutputStream fop) throws IOException{
        		/* 遍历整个图像,xy像素点填充字符 */
        		for (int j = image.getMinY(); j < image.getHeight(); j++) {
        			for (int i = image.getMinX(); i < image.getWidth(); i++) {
        				RgbPixel pixel = PictureReader.getScreenPixel(image, i, j);
        				int index = RgbNumberWritter.getChar(pixel);
        				fop.write(DICTORY.charAt(index));// 插入字符
        				fop.write(32);// 加个空格,防止图片会看起来扁了一半
        			}
        			/* 填充换行符 */
        			fop.write(10);
        		}
        }
    

    这里为了方便,自己写了一个RgbPixel类(getter和setter没有贴出)

        public class RgbPixel {
        	private int red;
        	private int green;
        	private int blue;
        	public double getGray(){
        		/*
        		 * 灰度值公式:Gray=R×0.299+G×0.587+B×0.114
        		 */
        		double gray=red*0.299+green*0.587+blue*0.114;
        		return gray;
        }
    

    从字符字典中获取对应字符(根据灰度值):DICTORY是字典,下标越大,代表其灰度值越大

    	private final static String DICTORY=" .,·-'`:!1+*abcdefghijklmnopqrstuvwxyz<>()\\/{}[]?23456789AJKLICFDBEGHMNPQRSTUVWXYZ%&#$0O@";
    	private final static int DICTORY_LEN=DICTORY.length();
    	/** 获取该灰度值对应下标 */
    	public static int getChar(RgbPixel rgb){
    		double key =DICTORY_LEN- Math.round(rgb.getGray()/STEP);
    		if(key>=1){
    			key-=1;
    		}
    		return (int)key;
    	}
    

    通过上面几个步骤,可以很快的生成对应的txt文本:
    txt图片

    三、字符画(txt)转图片

    (一)、方法

    字符画转图片,只需要读取txt文本里的文本信息,然后直接画在图片上即可,
    Graphics提供了drawString方法,可以很方便的生成,需要注意的是,为了生成的图片能尽可能的还原图片,所以建议使用等宽字体,并且调整好图片的大小(字体的单位是pt,像素单位是px,具体请参考:https://blog.csdn.net/gogl/article/details/48584191https://blog.csdn.net/flyeek/article/details/43934945
    为什么还要多此一举把txt生成图片呢?因为我电脑上的文本阅读器功能比较少,不能将文字缩放成特别小的尺寸,所以生成的字符画看不到全局,而图片可以。

    这里挖个坑,剩下的以后写,部分代码如下

    (二)、代码

    public static boolean writePictureFromFile(File file,String output,
    			 int IMAGE_WIDTH , int IMAGE_HEIGHT,final int fontSize,boolean whiteBackGround){
    		boolean flag=false;
    		if(file!=null&&file.exists()&&!file.isDirectory()){
    			BufferedReader reader = null;
    	        try {
    	            reader = new BufferedReader(new FileReader(file));
    	            //像素点和字体大小转化
    //	        	IMAGE_WIDTH*=ptToPx(fontSize);
    //	        	IMAGE_HEIGHT*=(ptToPx(fontSize)+2);
    		        IMAGE_WIDTH*=((fontSize&1)==0? fontSize:fontSize+1); 
    		        IMAGE_HEIGHT*=(fontSize+2);
    //	        	StringOutputter .print("produce a image with Width:? ,Height:?",IMAGE_WIDTH,IMAGE_HEIGHT);
    		        BufferedImage bimage = new BufferedImage(IMAGE_WIDTH, IMAGE_HEIGHT,BufferedImage.TYPE_INT_RGB);
    		        //获取图像上下文
    		        Graphics g = createGraphics(bimage,IMAGE_WIDTH,IMAGE_HEIGHT,fontSize,whiteBackGround);
    		        String line;
    		        //图片中文本行高
    		        FontMetrics metrics = g.getFontMetrics();
    //		        final int Y_LINEHEIGHT =  (ptToPx(fontSize)+2);//一般是像素大小+2
    		        final int Y_LINEHEIGHT = metrics.getHeight(); //相当于fontsize+2;
    //		        StringOutputter.print("@ :height:? ,Y_LINEHEIGHT: ?", height,Y_LINEHEIGHT);
    		        int lineNum = 1;
    		        try {
    		            while((line = reader.readLine()) != null){
    //		            	StringOutputter.print("Get Line[?]:?",lineNum,line);
    		                g.drawString(line, 0, lineNum * Y_LINEHEIGHT);
    //		                StringOutputter.print("lineNum * Y_LINEHEIGHT: ? ,width:?", lineNum * Y_LINEHEIGHT,metrics.stringWidth(line));
    		                lineNum++;
    		            }
    		            g.dispose();
    		            //保存为jpg图片
    		            FileOutputStream out = new FileOutputStream(output);
    	                ImageIO.write(bimage, "JPEG", out);
    	                out.close();
    	                StringOutputter.print("写文本图片(像素:(?,?))==>成功 (输出路径:?)",IMAGE_WIDTH,IMAGE_HEIGHT, output);
    		        } catch (IOException e) {
    		            e.printStackTrace();
    		            return false;
    		        }
    		        return true;
    	        } catch (FileNotFoundException e) {
    	            e.printStackTrace();
    	            return false;
    	        }finally{
    	        	if(reader!=null){
    	        		try {
    						reader.close();
    					} catch (IOException e) {
    						e.printStackTrace();
    					}
    	        	}
    	        }
    	       
    		}
    		return flag;
    	}
    /**
     * 获取图片的上下文,设置样式
     * @param image 处理的图片对象
     * @param IMAGE_WIDTH 宽
     * @param IMAGE_HEIGHT 高
     * @param fontSize 字体大小
     * @param whiteBackGround 是否为白底黑字
     * @return
     */
    private static Graphics createGraphics(final BufferedImage image,
    		final int IMAGE_WIDTH,final  int IMAGE_HEIGHT,final int fontSize,final boolean whiteBackGround){
        if(IMAGE_WIDTH>0&&IMAGE_HEIGHT>0){
        	//创建图片
        	Graphics g = image.createGraphics();
        	//设置背景色
        	if(whiteBackGround){
        		g.setColor(null); 
        	}else{
        		g.setColor(Color.BLACK);
        	}
            g.fillRect(0, 0, IMAGE_WIDTH, IMAGE_HEIGHT);//绘制背景
            //设置前景色
            if(whiteBackGround){
            	 g.setColor(Color.BLACK); 
            }else{
            	 g.setColor(Color.WHITE); 
            }
            g.setFont(new Font(FONT_NAME, Font.PLAIN, fontSize)); //设置字体
            return g;
        }
    	return null;
    }
    

    四、代码共享

    挖个坑以后填…

    大小姐(字符画图片)

    这真的是字符串!

    展开全文
  • 主要介绍了基于python实现图片转字符代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • python生成汉字图片

    2015-10-08 10:35:50
    使用python生成汉字图片库,该程序生成3755个汉字图片,使用仿宋字体,可以下载别的字体库题
  • 在国标 GD2312—80 中规定,所有的国标汉字及符号分配在一个 94 行、94 列的阵中,方阵的每一行称为一个“区”,编号为 01 区到 94 区,每一列称为一个“位”,编号01 位到 94 位,方阵中的每一个汉字和符号所在的...

    一、 点阵字库的原理

    一、 汉字编码

    1. 区位码

    在国标 GD2312—80 中规定,所有的国标汉字及符号分配在一个 94 行、94 列的阵中,方阵的每一行称为一个“区”,编号为 01 区到 94 区,每一列称为一个“位”,编号01 位到 94 位,方阵中的每一个汉字和符号所在的区号和位号组合在一起形成的四个阿伯数字就是它们的“区位码”。区位码的前两位是它的区号,后两位是它的位号。用区位码可以唯一地确定一个汉字或符号,反过来说,任何一个汉字或符号也都对应着一个唯一区位码。汉字“母”字的区位码是 3624,表明它在方阵的 36 区 24 位,问号“?”的区位码0331,则它在 03 区 3l 位。

    2. 机内码

    汉字的机内码是指在计算机中表示一个汉字的编码。机内码与区位码稍有区别。如上述,汉字区位码的区码和位码的取值均在 1~94 之间,如直接用区位码作为机内码,就与基本 ASCII 码混淆。为了避免机内码与基本 ASCII 码的冲突,需要避开基本 ASCII 码
    中的控制码(00H~1FH),还需与基本 ASCII 码中的字符相区别。为了实现这两点,可先在区码和位码分别加上 20H,在此基础上再加 80H(此处“H”表示前两位数字为十六进数)。经过这些处理,用机内码表示一个汉字需要占两个字节,分别 称为高位字节和低位字
    节,这两位字节的机内码按如下规则表示:

    高位字节 = 区码 + 20H + 80H(或区码 + A0H)

    低位字节 = 位码 + 20H + 80H(或位码 + AOH)
    由于汉字的区码与位码的取值范围的十六进制数均为 01H~5EH(即十进制的 01~4),所以汉字的高位字节与低位字节的取值范围则为 A1H~FEH(即十进制的 161~254)。

    例如,汉字“啊”的区位码为 1601,区码和位码分别用十六进制表示即为 1001H,的机内码的高位字节为 B0H,低位字节为 A1H,机内码就是 B0A1H。

    二、 点阵字库结构

    1. 点阵字库存储

    在汉字的点阵字库中,每个字节的每个位都代表一个汉字的一个点,每个汉 字都是由一个矩形的点阵组成,0 代表没有,1 代表有点,将 0 和 1 分别用不同 颜色画出,就形成了一个汉字,常用的点阵矩阵有 1212, 1414, 16*16 种字库。
    字库根据字节所表示点的不同有分为横向矩阵和纵向矩阵,目前多数的字库 都是横向矩阵的存储方式(用得最多的应该是早期UCDOS 字库),纵向矩阵般是因为有某些液晶是采用纵向扫描显示法,为了提高显示速度,于是便把字矩阵做成纵向,省得在显示时还要做矩阵转换。我们接下去所描述的都是指横矩阵字库。

    2. 16*16 点阵字库

    1616 点阵字库 对于 1616 的矩阵来说,它所需要的位数共是 16*16=256 个位,每个字 节为 8 位,因此,每个汉字都需要用 256/8=32 个字节来表示。 即每两个字节代表一行的 16 个点,共需要 16行,显示汉字时,只需一次 性读取 32 个字节,并将每两个字节为一行打印出来,即可形成一个汉字。

    点阵结构如下图所示:
    在这里插入图片描述

    3 1414 与 1212 点阵字库

    对于 1414 和 1212 的字库,理论上计算,它们所需要的点阵分别为(14 14/8)=25, (1212/8)=18 个字节,但是,如果按这种方式来存储,那么取 点阵和显示时,由于它们每一行都不是 8 的整位数,因此,就会涉到点阵的算处理问题,会增加程序的复杂度,降低程序的效率。 为了解决这个问题,有些点阵字库会将 1414 和 1212 的字库按 1614 和 1612 来存储,即,每行还是按两个字节来存储,但是 1414 的字库,每 两个字节的最后两位是没有使用,1212 的字节,每两字节的最后 4 位是没使用,这个根据不同的字库会有不同的处理方式,所以在使用字库时要注意这个 问题,特别是 14*14 的字库。

    三、 汉字点阵获取

    1. 利用区位码获取汉字

    汉字点阵字库是根据区位码的顺序进行存储的,因此,我们可以根据区位获取一个字库的点阵,它的计算公式如下: 点阵起始位置 = ((区码- 1)*94 + (位码 – 1)) * 汉字点阵字节数获取点阵起始位置后,我们就可以从这个位置开始,读取出一个汉字的点阵。

    2. 利用汉字机内码获取汉字

    前面我们己经讲过,汉字的区位码和机内码的关系如下:
    机内码高位字节 = 区码 + 20H + 80H(或区码 + A0H)
    机内码低位字节 = 位码 + 20H + 80H(或位码 + AOH)
    反过来说,我们也可以根据机内码来获得区位码:
    区码 = 机内码高位字节 - A0H
    位码 = 机内码低位字节 - AOH
    将这个公式与获取汉字点阵的公式进行合并计就可以得到汉字的点阵位置。
    我们可以使用软件ultraedit配合字库查看工具来查看每一个文字在字库中的位置。

    使用教程:

    先创建了一个文本文件并添加了我自己的名字,并以ANSI的编码格式保存。
    在这里插入图片描述

    然后用UltraEdit使用十六进制模式编辑这个文本文件,就会得到每个字体在字库中的位置。
    在这里插入图片描述

    接着打开我们下载的字库查看工具,打开字库后依次查找每一个汉字。

    在这里插入图片描述

    以上图片中的汉字代码和UltraEdit中使用16进制查看文字得到的代码一致,因此验证成功。

    二、代码

    
    #include <unistd.h>
    #include <stdio.h>
    #include <opencv/cxcore.h>
    #include <sys/types.h>
    #include <opencv2/opencv.hpp>
    #include <opencv2/highgui.hpp>
    #include<iostream>
    using namespace std;
    using namespace cv;
    const int CC_SIZE = 16;
    const int SAFE_WIDTH = 10;
    const int CC_NUMBER = 15;
    // 姓名
    unsigned char name[7] ="王尉铭";
    unsigned int name_code[3][2];
    
    // 学号
    unsigned int id_code[12][2] = { { 0xa3, 0xb6 },{ 0xa3, 0xb3 },{ 0xa3, 0xb1 },{ 0xa3, 0xb6 },{ 0xa3, 0xb0 },{ 0xa3, 0xb7 },{ 0xa3, 0xb0 },{ 0xa3, 0xb4 },{ 0xa3, 0xb0 },{ 0xa3, 0xb3 },{ 0xa3, 0xb0 },{ 0xa3, 0xb5} };
    
    // 保存字节的数组
    unsigned char mat[16][2];
    FILE* HZK16;
    IplImage* img;
    void get_area_position_codes();
    void get_mat(int a_code, int p_code);
    void open_file();
    void draw_one_cc(int num);
    void release();
    int main()
    {
       open_file();
       get_area_position_codes();
       // 写名字
       int i, j;
       for (i = 0; i < 3; ++i)
       {
       	get_mat(name_code[i][0], name_code[i][1]);
       	draw_one_cc(i);
       }
       // 写学号
       for (j = 0; j < 12; ++j)
       {
       	get_mat(id_code[j][0] - 0xa0, id_code[j][1] - 0xa0);
       	draw_one_cc(i + j);
       }
       // 显示图片
       cvShowImage("IMAGE", img);
       cvWaitKey(0);
       release();
       return 0;
    }
    
    void get_area_position_codes()
    {
       for (int i = 0; i < 3; ++i)
       	for (int j = 0; j < 2; ++j)
       		name_code[i][j] = name[i * 2 + j] - 0xa0;
    }
    
    void get_mat(int a_code, int p_code)
    {
       long offset;
       offset = (94 * (a_code - 1) + (p_code - 1)) * 32L;
       // 读取数据存入数组
       fseek(HZK16, offset, SEEK_SET);
       fread(mat, 32, 1, HZK16);
    }
    
    void open_file()
    {
       char pbuf[100];
       getcwd(pbuf, 100);
       cout<<pbuf<<endl;
       strcat(pbuf, "/HZKf1616.hz");
       // 读取图片
       if ((img = cvLoadImage("test.jpg")) == NULL)exit(1);
       // 打开字体文件
       if ((HZK16 = fopen(pbuf, "rb")) == NULL)exit(1);
    }
    
    void draw_one_cc(int num)
    {
       // 图片的像素值
       int width, height;
       width = img->width;
       height = img->height;
       // 开始的x y像素点
       int start_x, start_y, size, current_start_x, current_start_y;
       size = CC_SIZE + SAFE_WIDTH;
       start_x = width - CC_NUMBER * size;
       start_y = height - CC_SIZE - SAFE_WIDTH;
       // 开始绘制
    
       CvScalar cs;
       for (int i = 0; i < 16; ++i)
       	for (int j = 0; j < 2; ++j)
       		for (int k = 0; k < 8; k++)
       			if (mat[i][j] & (0x80 >> k))
       			{
       				cout << mat[i][j] << endl;
       				// 绘点
       				current_start_x = j * 8 + k + start_x + size * num;
       				current_start_y = start_y + i;
       				cs = cvGet2D(img, current_start_y, current_start_x);
       				cs.val[0] = 0;
       				cs.val[1] = 0;
       				cs.val[2] = 0;
       				cvSet2D(img, current_start_y, current_start_x, cs);
       			}
    }
    
    void release()
    {
       cvReleaseImage(&img);
       fclose(HZK16);
       img = NULL;
       HZK16 = NULL;
    }
    
    

    这段代码中,我定义名字时:是在windows上写好了再传到树莓派上编译执行代码,因为在树莓派上直接输入名字或者使用vim定义名字都会出错:因为字符的编码格式的不同(windows下使用GBK或者utf_8显示中文,而树莓派使用的是ISO 8859-1拉丁语显示中文)

    工具、字库和代码我都已经上传在我的github中,有兴趣的可以去下载使用:

    (工具下载地址)https://github.com/Budexing/Tools/tree/master/ziku
    (代码下载地址)
    https://github.com/Budexing/Embeded-System/tree/master/opencv
    而UltraEdit可以直接百度下载试用30天。

    展开全文
  • 在django中为汉字添加水印: import PIL from PIL import Image, ImageDraw, ImageFont class ImageWatermarkAPIView(GenericAPIView): ... # 设置所使用的字体和字体的大小(注意有的字体中文不出来的)

    在django中为汉字添加水印:

    import PIL
    from PIL import Image, ImageDraw, ImageFont
    
    class ImageWatermarkAPIView(GenericAPIView):
        """给图片添加水印"""
    
        permission_classes = [IsAuthenticated]
    
        def get(self, request):
            # 设置所使用的字体和字体的大小(注意有的字体中文是画不出来的)
            font = ImageFont.truetype("/usr/share/fonts/chinese/simsun.ttc", 40)
    
            # 打开图片
            try:
                im1 = Image.open('/home/sundries/1.png')
            except:
                return APIResponse.fail(data=[], message="图片不存在,请确保图片存在!")
    
            # 画图
            draw = ImageDraw.Draw(im1)
            draw.text((100, 150), "这是最好的时代!", (255, 0, 0), font=font)  # 设置文字位置/内容/颜色/字体
            draw = ImageDraw.Draw(im1)
    
            # 另存图片
            im1.save("/home/sundries/11.png")
    
            return APIResponse.success(data=[], message="保存成功")
    

    原始图片:
    在这里插入图片描述
    加完水印的图片:
    在这里插入图片描述

    展开全文
  • 在如今这个互联网技术十分发达的年代,各种技术层出不穷。各种网站,APP也都应运而生。细看这些网站,APP,都少不了登录和注册这一功能,因为只有注册后登陆了网站或APP才能为各个用户保存...而图片验证码的形式也产...
  • // 图片中文本行高 final int Y_LINEHEIGHT = speed; int lineNum = 1; for (int i = miny; i ; i += speed) { // StringBuilder stringBuilder = new StringBuilder(); for (int j = minx; j ; j += ...
  • 简介最近发现一个有趣的操作, 将一张图片转化为字符串的模式来显示!...将字符导出到txt文本中开始用户输入图片路径传入一张图片利用cv2模块显示这张图片这里报了个错误, 通过百度, 我了解到是因为我的图片路径...
  • STM32 实现12864液晶屏显示汉字图片,且可在任意位置点、横线、竖线、斜线。其中所有程序全部由自己编写,且所有功能可全部实现。
  • C# 图片画矩形,添加文字

    千次阅读 2019-12-11 18:10:51
    // 文字用  2.初始设置图片和Graphics (可循环2-4) // pic draw Bitmap picBitmap = new Bitmap(fi.FullName); Graphics grapPic = Graphics.FromImage(picBitmap);  3.矩形和文字(可多次...
  • Python之图片转字符

    2018-09-27 16:16:34
    Python之图片转字符 参考资料来自Python 图片转字符 倒入第三方库 个人采用的IDE是PyCharm CE,这里简单的记录下倒入第三方库的办法 点击’+‘号,来添加我们的第三方库’Pillow’ Pillow 一个用来处理与图片...
  • OpenCV图片上写中文汉字,参考别人的记录一下 void paDrawString(cv::Mat& dst, const char* str, cv::Point org, cv::Scalar color, int fontSize, bool italic, bool underline) { CV_Assert(dst.data != 0...
  • Python在图片中加矩形框和中文汉字1.使用PIL在图片上显示中文2.使用openv 在图片中用矩形框 1.使用PIL在图片上显示中文 # -*- coding: utf-8 -*- import cv2 import numpy from PIL import Image, ImageDraw, ...
  • 一个将图片转换为文字的工具,这个软件参考了众多同类软件的长处,实现了从jpg、bmp、gif 图片到txt、html文本的转换,还可以转为“文字画板”文档(可将生成文字图用“文字画板”进行再加工);可以只对图片局部...
  • 共享版有中文版,没有大师自己为自己素描素描,可以把照片转成素描
  • 方便的拖拽功能可调整多个视频和图片的播放顺序和时间,给每个视频和图片可加入框架与特殊效果,针对不同视频和图片做出不同的个性片段素材,更可用的合成功能把片段素材制作成与众不同的视频。给视频和图片...
  • * 描述 :利用12864液晶屏显示汉字图片,且可在任意位置点、横线、竖线、斜线。 * 实验平台:THE_ONE_1 STM32开发板 * 库版本 :ST 3.5.0 * 硬件连接:并行接法 * -------------------------------------...
  • 关于python图片转字符,相信大家都不陌生,经常出现在 n个超有趣的python项目中。 今天我也来实践这个有趣的项目,更进一步的是把这个功能做成一个在线的网站,直接上传图片生成字符,在线预览可以让更多的人来...
  • 图片是由无数像素点组成的那么,我们可以将像图片分为x,y轴组成的区间,每一个像素点就是一个坐标点。再把像素点按照其灰度值进行对应的映射不就可以了吗? 首先要先安装一个第三方的库:pillow 先来试验一下这个库...
  • 最近需要做个图像采集的工作,其中一个步骤是需要将从摄像机采集的图像播放出来,由于摄像机采集的是一帧帧的图片,而播放的时候需要对播放速度进行控制,因此我考虑将图片放在一个缓冲区中,然后从缓存区中读取后...
  • linux 将数字符号到BMP图片

    千次阅读 2014-10-17 15:19:01
    首先我本先了解一下BMP图片的格式。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 73,160
精华内容 29,264
关键字:

像画一样的汉字图片