树莓派 java ssd1306 12864oled 任意字体 任意文字

树莓派使用java控制ssd1306驱动12864oled显示任意字体任意文字

  • 结果展示
  • 需要提前学习的材料
  • linux中安装windows的字体过程小记
  • 树莓派与12864接线
  • 树莓派执行关键java代码
    • 树莓派上安装的字体检查
    • 使用叶根友毛笔行书字体在oled上显示
    • 使用微软雅黑字体在oled上显示
  • 结尾自言自语

结果展示

  1. 这里先把最后做出来的东西给大家看看,感兴趣的同学可以继续往后看
  • 使用叶根友毛笔行书2.0版字体静态显示
    树莓派 java ssd1306 12864oled 任意字体 任意文字_第1张图片
  • 使用微软雅黑字体动态展示
    树莓派 java ssd1306 12864oled 任意字体 任意文字_第2张图片

需要提前学习的材料

承接之前的内容《使用jdk自带的BufferedImage和Font输出点阵字体图片》

  1. 在树莓派linux系统中生成点阵字,所以要保证树莓派的linux系统中有对应字体,才可以正常显示,but树莓派的linux系统中一般是不带windows字体的,jdk获取字体的原理请参考作者 小奔的早晨 的这篇内容:《Linux环境下Java中文乱码解决方案》
  2. 上边的这篇内容讲linux安装字体的流程有点模糊,安装字体参考作者 菊次郎的幻想 的文章《验证码图片变成字符》。这里特别要注意的是,树莓派中安装字体,一定要使用root用户!切记切记!!
  3. 本人写的短文1《树莓派使用java控制ssd1306驱动12864》,因为要用到github中的12864的驱动,但是之前的这篇短文太简陋了,只能输出特定大小的英文字符
  4. 本人写的短文2《树莓派使用jdk自带的BufferedImage和Font输出点阵字体图片》,因为要用到这篇文章给出的代码示例。

linux中安装windows的字体过程小记

  1. 先在windows系统中找到对应的字体,windows字体的存放路径为:C:\Windows\Fonts,截图见下,这里我选中微软雅黑叶根友毛笔行书
    树莓派 java ssd1306 12864oled 任意字体 任意文字_第3张图片
  2. 在树莓派中切换root用户,并在/usr/share/fonts目录下新建一个自己的字体文件夹,比如我的文件叫myfont
>cd /usr/share/fonts
>mkdir myfont
#以下这行记得要777的权限,要不然树莓派传字体文件的时候可能权限不够
>chmod  777 myfont/      
  1. 然后将步骤1选中的字体放入这个目录下,见我的截图,咦,微软雅黑怎么是两个TTF字体,诡异,求了解的同学科普(待我先写完本文再详查为啥):
    在这里插入图片描述
  2. 然后是树莓派上安装字体,继续用root操作,切记一定要用root用户,参考上边提到的文章《验证码图片变成字符》
>mkfontscale
>mkfontdir
>fc-cache -fv
#有个问题,我们的树莓派系统默认是没有这些命令的,我们需要在线安装以下命令,命令如下:
>yum install mkfontscale
#安装完了mkfontscale再执行以上3个命令即可

树莓派与12864接线

  1. 接线方向见下图,傻瓜式I2C接线
    树莓派 java ssd1306 12864oled 任意字体 任意文字_第4张图片

树莓派执行关键java代码

树莓派上安装的字体检查

  1. 先看下我们的字体在树莓派上安装成功了没。参考作者憨厚老实的老赵的文章《Java查看可用字体》:
        GraphicsEnvironment e = GraphicsEnvironment.getLocalGraphicsEnvironment();
        String[] fontName = e.getAvailableFontFamilyNames();
        for (int i = 0; i < fontName.length; i++) {
     
            System.out.println(fontName[i]);
        }
  1. 树莓派上运行一下,看下树莓派上总共有那些字体:
pi@raspberrypi:~ $ java -jar oled-0.0.1-SNAPSHOT.jar
  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.3.0.RELEASE)
2020-06-23 22:59:47.355  INFO 6945 --- [           main] com.oled.oled.OledApplication            : Starting OledApplication v0.0.1-SNAPSHOT on raspberrypi with PID 6945 (/home/pi/oled-0.0.1-SNAPSHOT.jar started by pi in /home/pi)
WenQuanYi Zen Hei
WenQuanYi Zen Hei Mono
WenQuanYi Zen Hei Sharp
Microsoft YaHei
叶根友毛笔行书2.0版
  1. 可以看到成功安装了我们想要的两个字体
    • Microsoft YaHei
    • 叶根友毛笔行书2.0版

使用叶根友毛笔行书字体在oled上显示

  1. 现在我们尝试用毛笔行书显示在12864上,具体代码见下。需要依赖ssd1306的驱动,见我之前的短文《树莓派使用java控制ssd1306驱动12864》:
    public static void displayILoveYou() throws IOException, I2CFactory.UnsupportedBusNumberException {
     
        //初始化一个长128,高64的图片,二进制图片TYPE_BYTE_BINARY
        BufferedImage image = new BufferedImage(128, 64,
                BufferedImage.TYPE_BYTE_BINARY);
        Graphics2D g = image.createGraphics();
        //制定字体:叶根友毛笔行书2.0版,不加粗(加粗使用java.awt.Font.BOLD),字体像素24
        g.setFont(new java.awt.Font("叶根友毛笔行书2.0版", java.awt.Font.PLAIN, 24));
        g.setColor(new Color(0xffffffff));
        g.drawString("我爱你", 0, 23);//定义“我”字左下角坐标在(0,23)处
        g.drawString("才怪", 64, 60);//定义“才”字左下角坐标在(64,60)处

        OLEDDisplay display = new OLEDDisplay();
        display.drawImage(image, 0, 0);
        display.update();
        for (; ; ) {
     
        }
    }
  1. 在树莓派派上运行后,在oled上显示如截图:
    树莓派 java ssd1306 12864oled 任意字体 任意文字_第5张图片

使用微软雅黑字体在oled上显示

  1. 现在我们尝试用微软雅黑字体显示在12864上,需要依赖ssd1306的驱动,见我之前的短文《树莓派使用java控制ssd1306驱动12864》。这次我们尝试输出一下时间,相当于每秒会有秒速跳动一下。具体代码见下。
    public static void printFontImage() throws IOException, InterruptedException, I2CFactory.UnsupportedBusNumberException {
     
        OLEDDisplay display = new OLEDDisplay();
        for (; ; ) {
     
            BufferedImage image = new BufferedImage(128, 64,
                    BufferedImage.TYPE_BYTE_BINARY);
            Graphics2D g = image.createGraphics();
            //从树莓派的输出上,看到微软雅黑字体名为:Microsoft YaHei,指定字体为15像素
            g.setFont(new java.awt.Font("Microsoft YaHei", java.awt.Font.PLAIN, 15));
            g.setColor(new Color(0xffffffff));
            Date date = new Date();
            String dayTiem = String.format("%tY年%tm月%td日", date,date,date);
            String nowTime = String.format("  %tH时%tM分%tS秒", date,date,date);

            g.drawString(dayTiem, 0, 15);
            g.drawString(nowTime, 0, 31);
            g.drawString("做你的男人", 0, 47);
            g.drawString("24个小时不睡觉", 0, 63);

            display.drawImage(image, 0, 0);
            display.update();
            Thread.sleep(1000); //1000ms刷新一次,保护树莓派脆弱的性能
            display.clear();
        }
    }
  1. 以下是显示效果:
    树莓派 java ssd1306 12864oled 任意字体 任意文字_第6张图片

结尾自言自语

  1. BufferedImage类结合ssd1306的驱动,显示起来得心应手,想显示啥语音显示啥语言,想显示啥字体显示啥字体,简直神一样的存在。不像其他很多对文字取模,然后再挨个bit确认是否显示一样繁琐(其实这些东西已经由ssd1306的驱动帮忙搞定了,再次感谢该驱动作者,虽然他听不见哈哈)。让我们从取字模的流程中解脱出来。
  2. 包括什么树莓派气象站的文字显示,中文不是超级清爽么。
  3. 再就是表个白,晒个朋友圈,用这个不香么~对了,你确定作为程序员,你有女友么?
  4. 用BufferedImage读取图片,也可以在12864上进行显示,至于效果嘛,稍后我也试下,再发出来与大家看看。
  5. 多啰嗦一句,我就是个java菜鸟程序员,但就喜欢在树莓派上跑java,示例代码写的不足之处,还请大家指正。谢谢。

你可能感兴趣的:(java,12864,小制作,raspberry,pi,java)