python2和python3实现在图片上加汉字的方法

python2和python3实现在图片上加汉字,最主要的区别还是内部编码方式不一样导致的,在代码上表现为些许的差别。理解了内部编码原理也就不会遇到这些问题了,以下代码是在WIN10系统上时测好用的。

Python2 在图片上加汉字代码实现

# -*- coding: cp936 -*-
import cv2
import numpy as np
from PIL import Image, ImageDraw, ImageFont
def ID_2_Word(txt):
  tmp_ID = txt.split(':')[0]
  value = txt.split(':')[-1]
  '''
  numbers = {
    'DS041' : "Coolant TEMP     ",
    'DS048' : "RPM          ",
    'DS049' : "Speed         ",
    'DS098' : "Oil level       ",
    'DS123' : "Control Module Voltage"
  }
  '''
  numbers = {
    'DS041' : "冷却液温度",
    'DS048' : "发动机转速",
    'DS049' : "车速  ",
    'DS098' : "燃油液位输入",
    'DS123' : "控制模块电压"
  }
  word = numbers.get(tmp_ID, None)
  result = str(word) + ':' + value
  #print(result)
  return result
def cv2ImgAddText(img, text, left, top, textColor=(0, 255, 0), textSize=20):
  if (isinstance(img, np.ndarray)): #判断是否OpenCV图片类型
    img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
  draw = ImageDraw.Draw(img)
  #fontText = ImageFont.truetype("font/simsun.ttc", textSize, encoding="utf-8")
  fontText = ImageFont.truetype("font/simsun.ttc", textSize, encoding="gb2312") #cp936
  draw.text((left, top), text, textColor, font=fontText)
  return cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)
def layer1_show(img,data):
  frame = cv2.resize(img, (1280, 720), interpolation=cv2.INTER_CUBIC)
  font = ImageFont.truetype('font/simsun.ttc',24,encoding="utf-8")
  OBD_string = data
  y0, dy = 50, 25
  for i, txt in enumerate(OBD_string.split(';')):
      #word = txt
    word = ID_2_Word(txt) #将OBD信号的ID转换为中文
    word = unicode(word,'gbk')
      #print(i, txt.split(':')[0])
    y = y0+i*dy
    frame = cv2ImgAddText(frame, word, 100, y, (255, 0, 0), 20)
  cv2.imshow("layer_1", frame)
  cv2.waitKey(0)
if __name__ == '__main__':
  img = cv2.imread("map.png");
  data = "DS041: 88;DS048: 800;DS049: 64;DS098: 0.00;DS123: 0.00"
  layer1_show(img,data)

Python3 在图片上加汉字代码实现

import cv2
import numpy as np
from PIL import Image, ImageDraw, ImageFont
def ID_2_Word(txt):
  tmp_ID = txt.split(':')[0]
  value = txt.split(':')[-1]
  '''
  numbers = {
    'DS041' : "Coolant TEMP     ",
    'DS048' : "RPM          ",
    'DS049' : "Speed         ",
    'DS098' : "Oil level       ",
    'DS123' : "Control Module Voltage"
  }
  '''
  numbers = {
    'DS041' : "冷却液温度",
    'DS048' : "发动机转速",
    'DS049' : "车速  ",
    'DS098' : "燃油液位输入",
    'DS123' : "控制模块电压"
  }
  word = numbers.get(tmp_ID, None)
  result = str(word) + ':' + value
  #print(result)
  return result
def cv2ImgAddText(img, text, left, top, textColor=(0, 255, 0), textSize=20):
  if (isinstance(img, np.ndarray)): #判断是否OpenCV图片类型
    img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
  draw = ImageDraw.Draw(img)
  #fontText = ImageFont.truetype("font/simsun.ttc", textSize, encoding="utf-8")
  fontText = ImageFont.truetype("font/simsun.ttc", textSize, encoding="gb2312") #cp936
  draw.text((left, top), text, textColor, font=fontText)
  return cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)
def layer1_show(img,data):
  frame = cv2.resize(img, (1280, 720), interpolation=cv2.INTER_CUBIC)
  font = ImageFont.truetype('font/simsun.ttc',24,encoding="utf-8")
  OBD_string = data
  y0, dy = 50, 25
  for i, txt in enumerate(OBD_string.split(';')):
      #word = txt
    word = ID_2_Word(txt) #将OBD信号的ID转换为中文
    #word = unicode(word,'gbk')
    y = y0+i*dy
    frame = cv2ImgAddText(frame, word, 100, y, (255, 0, 0), 20)
  cv2.imshow("layer_1", frame)
  cv2.waitKey(0)
if __name__ == '__main__':
  img = cv2.imread("map.png");
  data = "DS041: 88;DS048: 800;DS049: 64;DS098: 0.00;DS123: 0.00"
  layer1_show(img,data)

遇到的问题

python2中:UnicodeDecodeError: ‘ascii' codec can't decode byte 0xe8 in position 0: ordinal not in range(128)

这是因为这是因为默认的是utf-8编码格式

中文字符的Unicode编码0x0800-0xFFFF之间,(utf-8包含了部分汉字)
当你试图将该“中文字符”转成U码的utf-8时超出了其范筹
而GBK 规范收录了 ISO 10646.1 中的全部 CJK 汉字和符号,并有所补充,
所以解决方法是将utf-8改为gbk

word = unicode(word,'utf-8') 改为 word = unicode(word,'gbk')

总结

以上所述是小编给大家介绍的python2和python3实现在图片上加汉字的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

(0)

相关推荐

  • 对Python生成汉字字库文字,以及转换为文字图片的实例详解

    笔者小白在收集印刷体汉字的深度学习训练集的时候,一开始就遇到的了一个十分棘手的问题,就是如何获取神经网络的训练集数据.通过上网搜素,笔者没有找到可用的现成的可下载的汉字的训练集,于是笔者采用了代码自建汉字的训练集数据. 这里采用的是python编写程序,需要import 的python库请提前安装. 那么,首先如何用python输出汉字字库的文字? 笔者查到在计算机中汉字编码范围是0x4E00到0x9FA5,利用unichr()可以将十六进制的编码转成人类可读的字. 这里扩展一下在python库

  • Python输出汉字字库及将文字转换为图片的方法

    用python输出汉字字库 问题1:假设我们知道汉字编码范围是0x4E00到0x9FA5,怎么从十六进制的编码转成人类可读的字呢? 问题2:怎么把unicode编码的字写入文件呢,如果直接用open()的话,会提示UnicodeEncodeError: 'ascii' codec can't encode character u'\u4e00' in position 0: ordinal not in range(128) 问题1的答案是用unichr,问题2的答案是用codecs. 下面上代

  • python2和python3实现在图片上加汉字的方法

    python2和python3实现在图片上加汉字,最主要的区别还是内部编码方式不一样导致的,在代码上表现为些许的差别.理解了内部编码原理也就不会遇到这些问题了,以下代码是在WIN10系统上时测好用的. Python2 在图片上加汉字代码实现 # -*- coding: cp936 -*- import cv2 import numpy as np from PIL import Image, ImageDraw, ImageFont def ID_2_Word(txt): tmp_ID = tx

  • 利用CSS、JavaScript及Ajax实现图片预加载的方法

    预加载图片是提高用户体验的一个很好方法.图片预先加载到浏览器中,访问者便可顺利地在你的网站上冲浪,并享受到极快的加载速度.这对图片画廊及图片占据很大比例的网站来说十分有利,它保证了图片快速.无缝地发布,也可帮助用户在浏览你网站内容时获得更好的用户体验.本文将分享三个不同的预加载技术,来增强网站的性能与可用性. 实现图片预加载可以使用css.JavaScript.Ajax三种方法.下面分别介绍这些方法的实现. 使用CSS 单纯的使用css可以将图片加载到页面元素的背景上,这种方法简单.高效: #d

  • JS判断图片是否加载完成方法汇总(最新版)

    有时需要获取图片的尺寸,这需要在图片加载完成以后才可以.下面小编给大家整理了几种关于JS判断图片是否加载完成方法汇总,一起看看吧. 一.load事件 <script type="text/javascript"> $('img').onload = function() { //code } </script> 优点:简单易用,不影响HTML代码. 缺点:只能指定一个元素,javascipt代码必须置于图片元素的下方 二.jquery方法 <script

  • ThinkPHP实现图片上传操作的方法详解

    本文实例讲述了ThinkPHP实现图片上传操作的方法.分享给大家供大家参考,具体如下: 直接上个例子,其中包括有单图片文件上传.多图片文件上传.以及删除文件的一些操作.放置删除数据库的时候,仅仅删除掉了数据库之中的文件路径.而不是一并删除服务器之中的文件.放置服务器爆炸.. TP里面common文件夹里面function.php里面自定义方法: <?php //文件上传类(可以设置多个参数) function upload($file=null,$maxSize=0,$exts=0,$saveP

  • yii2高级应用之自定义组件实现全局使用图片上传功能的方法

    本文讲述了yii2高级应用之自定义组件实现全局使用图片上传功能的方法.分享给大家供大家参考,具体如下: 此例为yii2高组应用,这里只提供一个简单的事例 在yii2中,在使用到上传图片时有自带的一个上传图片类,但不太好用. 其中有一种方式,把自己写的一个上传图片类文件,注册成一个组件,在全局中使用.(我记得我在里面有写过一篇小物件的使用) 这里,我只作一个简单的自定义组件介绍 1.在backend(或frontend)定义一个 upload.php(注意路径: backend/component

  • 从零开始学习Node.js系列教程三:图片上传和显示方法示例

    本文实例讲述了Node.js图片上传和显示方法.分享给大家供大家参考,具体如下: index.js var server = require("./server"); var router = require("./router"); var requestHandlers = require("./requestHandlers"); var handle = {} handle["/"] = requestHandlers

  • 原生javaScript实现图片延时加载的方法

    本文实例讲述了原生javaScript实现图片延时加载的方法.图片延时加载其实是有jquery插件了并且加载方法非常的简单并且合理了,但有朋友觉得加载jquery插件包太大了,于时自己写了一个,给各位分享一下. 首先,图片延时加载可以节省我们带宽,获取到更好的用户体验,尤其对于图片多的站点,这一点显得至关重要,下面就跟大家探讨一下图片延时加载原理和实现代码. 图片延时加载原理 图片延时加载原理是在html里面的图片src填的并不是真正的图片地址,而是以一种自定义属性把图片地址赋给img标签,如:

  • JQuery+CSS实现图片上放置按钮的方法

    本文实例讲述了JQuery+CSS实现图片上放置按钮的方法.分享给大家供大家参考.具体分析如下: position:relative日常应用的时候一般是设置给position:absolute;的父层的, 父层position:relative; 子层position:absolute;的话, 就是依照父层的边界进行定位的, 不然position:absolute 会逐层向上寻找设置了position:relative的元素边界, 直到body元素.. 第一种写法(连同CSS一起追加进去) va

  • Android 使用Canvas在图片上绘制文字的方法

    [Android]Android中 Paint 字体.粗细等属性的一些设置 在Android SDK中使用Typeface类来定义字体,可以通过常用字体类型名称进行设置,如设置默认黑体: Paint mp = new paint(); mp.setTypeface(Typeface.DEFAULT_BOLD) 常用的字体类型名称还有: * Typeface.DEFAULT //常规字体类型 * Typeface.DEFAULT_BOLD //黑体字体类型 * Typeface.MONOSPACE

  • Python3实现获取图片文字里中文的方法分析

    本文实例讲述了Python3实现获取图片文字里中文的方法.分享给大家供大家参考,具体如下: 一.运行环境 (1) win10 (2) pycharm (3) python 3.5 (4) pillow与pytesseract库安装: pip3 install pillow pip3 install pytesseract (5)  识别引擎tesseract-ocr ,下载之后解压安装,下载地址:https://www.jb51.net/softs/538925.html 二. 运行代码 # -

随机推荐