首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

从C中在Linux上的framebuffer上绘制文本

从C中在Linux上的framebuffer上绘制文本,需要使用一些基本的库和函数来实现。以下是一个简单的示例,展示了如何在Linux framebuffer上绘制文本。

首先,需要安装必要的库和头文件:

代码语言:txt
复制
sudo apt-get install libsdl2-dev

然后,编写一个简单的C程序来绘制文本:

代码语言:c
复制

#include <SDL2/SDL.h>

#include <SDL2/SDL_ttf.h>

#include<stdio.h>

#include <stdlib.h>

#include <fcntl.h>

#include <sys/mman.h>

#include <unistd.h>

#include <stdint.h>

#define FBDEV "/dev/fb0"

#define FONT_PATH "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf"

int main(int argc, char *argv[])

{

代码语言:txt
复制
int fbfd = 0;
代码语言:txt
复制
struct fb_var_screeninfo vinfo;
代码语言:txt
复制
struct fb_fix_screeninfo finfo;
代码语言:txt
复制
char *fbp = 0;
代码语言:txt
复制
long int screensize = 0;
代码语言:txt
复制
int x = 0, y = 0;
代码语言:txt
复制
int font_size = 24;
代码语言:txt
复制
SDL_Window *window;
代码语言:txt
复制
SDL_Renderer *renderer;
代码语言:txt
复制
SDL_Texture *texture;
代码语言:txt
复制
SDL_Surface *surface;
代码语言:txt
复制
TTF_Font *font;
代码语言:txt
复制
SDL_Color color = {255, 255, 255};
代码语言:txt
复制
SDL_Rect dst_rect = {0, 0, 0, 0};
代码语言:txt
复制
const char *text = "Hello, world!";
代码语言:txt
复制
// 初始化SDL
代码语言:txt
复制
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
代码语言:txt
复制
    printf("SDL could not initialize! SDL_Error: %s\n", SDL_GetError());
代码语言:txt
复制
    exit(1);
代码语言:txt
复制
}
代码语言:txt
复制
// 初始化TTF
代码语言:txt
复制
if (TTF_Init() < 0) {
代码语言:txt
复制
    printf("TTF could not initialize! SDL_Error: %s\n", SDL_GetError());
代码语言:txt
复制
    exit(1);
代码语言:txt
复制
}
代码语言:txt
复制
// 打开framebuffer设备
代码语言:txt
复制
fbfd = open(FBDEV, O_RDWR);
代码语言:txt
复制
if (fbfd == -1) {
代码语言:txt
复制
    perror("Error: cannot open framebuffer device");
代码语言:txt
复制
    exit(1);
代码语言:txt
复制
}
代码语言:txt
复制
// 获取屏幕信息
代码语言:txt
复制
if (ioctl(fbfd, FBIOGET_FSCREENINFO, &finfo) == -1) {
代码语言:txt
复制
    perror("Error reading fixed information");
代码语言:txt
复制
    exit(1);
代码语言:txt
复制
}
代码语言:txt
复制
if (ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo) == -1) {
代码语言:txt
复制
    perror("Error reading variable information");
代码语言:txt
复制
    exit(1);
代码语言:txt
复制
}
代码语言:txt
复制
// 计算屏幕大小
代码语言:txt
复制
screensize = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel / 8;
代码语言:txt
复制
// 映射到用户内存
代码语言:txt
复制
fbp = (char *)mmap(0, screensize, PROT_READ | PROT_WRITE, MAP_SHARED, fbfd, 0);
代码语言:txt
复制
if (fbp == (char *)-1) {
代码语言:txt
复制
    perror("Error: failed to map framebuffer device to memory");
代码语言:txt
复制
    exit(1);
代码语言:txt
复制
}
代码语言:txt
复制
// 创建SDL窗口
代码语言:txt
复制
window = SDL_CreateWindow("Draw Text on Framebuffer", 0, 0, vinfo.xres, vinfo.yres, SDL_WINDOW_FULLSCREEN_DESKTOP);
代码语言:txt
复制
if (!window) {
代码语言:txt
复制
    fprintf(stderr, "SDL_CreateWindow failed: %s\n", SDL_GetError());
代码语言:txt
复制
    exit(1);
代码语言:txt
复制
}
代码语言:txt
复制
// 创建渲染器
代码语言:txt
复制
renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
代码语言:txt
复制
if (!renderer) {
代码语言:txt
复制
    fprintf(stderr, "SDL_CreateRenderer failed: %s\n", SDL_GetError());
代码语言:txt
复制
    exit(1);
代码语言:txt
复制
}
代码语言:txt
复制
// 加载字体
代码语言:txt
复制
font = TTF_OpenFont(FONT_PATH, font_size);
代码语言:txt
复制
if (!font) {
代码语言:txt
复制
    fprintf(stderr, "TTF_OpenFont failed: %s\n", TTF_GetError());
代码语言:txt
复制
    exit(1);
代码语言:txt
复制
}
代码语言:txt
复制
// 创建文本纹理
代码语言:txt
复制
surface = TTF_RenderText_Blended(font, text, color);
代码语言:txt
复制
if (!surface) {
代码语言:txt
复制
    fprintf(stderr, "TTF_RenderText_Blended failed: %s\n", TTF_GetError());
代码语言:txt
复制
    exit(1);
代码语言:txt
复制
}
代码语言:txt
复制
// 创建纹理
代码语言:txt
复制
texture = SDL_CreateTextureFromSurface(renderer, surface);
代码语言:txt
复制
if (!texture) {
代码语言:txt
复制
    fprintf(stderr, "SDL_CreateTextureFromSurface failed: %s\n", SDL_GetError());
代码语言:txt
复制
    exit(1);
代码语言:txt
复制
}
代码语言:txt
复制
// 设置绘制位置
代码语言:txt
复制
dst_rect.x = x;
代码语言:txt
复制
dst_rect.y = y;
代码语言:txt
复制
dst_rect.w = surface->w;
代码语言:txt
复制
dst_rect.h = surface->h;
代码语言:txt
复制
// 清除屏幕
代码语言:txt
复制
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
代码语言:txt
复制
SDL_RenderClear(renderer);
代码语言:txt
复制
// 绘制文本
代码语言:txt
复制
SDL_RenderCopy(renderer, texture, NULL, &dst_rect);
代码语言:txt
复制
SDL_RenderPresent(renderer);
代码语言:txt
复制
// 等待用户退出
代码语言:txt
复制
SDL_Event event;
代码语言:txt
复制
while (1) {
代码语言:txt
复制
    if (SDL_PollEvent(&event)) {
代码语言:txt
复制
        if (event.type == SDL_QUIT) {
代码语言:txt
复制
            break;
代码语言:txt
复制
        }
代码语言:txt
复制
    }
代码语言:txt
复制
}
代码语言:txt
复制
// 释放资源
代码语言:txt
复制
SDL_DestroyTexture(texture);
代码语言:txt
复制
SDL_FreeSurface(surface);
代码语言:txt
复制
TTF_CloseFont(font);
代码语言:txt
复制
SDL_DestroyRenderer(renderer);
代码语言:txt
复制
SDL_DestroyWindow(window);
代码语言:txt
复制
TTF_Quit();
代码语言:txt
复制
SDL_Quit();
代码语言:txt
复制
munmap(fbp, screensize);
代码语言:txt
复制
close(fbfd
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Linux 使用 gImageReader 图像和 PDF 中提取文本

,OCR(光学字符识别)引擎可以让你图片或文件(PDF)扫描文本。默认情况下,它可以检测几种语言,还支持通过 Unicode 字符扫描。...将提取文本导出为 .txt 文件 跨平台(Windows) Linux 安装 gImageReader 注意:你需要安装 Tesseract 语言包,才能从软件管理器图像/文件中进行检测。...gimagereader 你也可以 openSUSE 构建服务中找到它,Arch Linux 用户可在 AUR 中找到。...当你尝试 PDF 文件中提取文本时,它效果非常好。 对于智能手机拍摄图片中提取,检测很接近,但有点不准确。也许当你进行扫描时,文件识别字符可能会更好。...我 Linux Mint 20.1(基于 Ubuntu 20.04)试过。 我只遇到了一个设置管理语言问题,我没有得到一个快速解决方案。

3K30

Linux用Eclipse写C++程序

我厂很多同学使用VCwindows编写linuxC/C++程序,然后再传开发服务器,然后再编译和调试。如果有修改,可能会直接用vi去改了,然后再把源代码同步回来。其实这样做挺折腾。...也有大神全盘vim设置emacs写,想来也是极好。 但是,也有另外一个方案,就是 Linux安装个写C/C++程序IDE,这样可以直接编写、编译、运行、上传SVN,非常方便。...其实要做到这点,也很简单: 你需要一个虚拟机来运行一个带GUILINUX,这样IDE才能运行起来,当然也可以直接在开发服务器安装GUI程序,然后WINDOWS办公PC这里设置个SSHX转发,装个...f=48&t=464303 一般我们还需要把虚拟机共享粘帖板和共享文件分区打开。这样就能很方便windows主机上和虚拟机交换数据了,这些功能虚拟机软件都带。...但是一般共享文件夹权限是vboxsf,而你登录帐号没权限看,每次都要sudo很麻烦,所以不如把自己加入到那个组:sudo adduser yourname vboxsf,然后重启一下虚拟机就生效了

3.4K70

Linux 文本编辑器 vim

Linux 文本编辑器 vimVim 编辑器:大多数Linux都会自带文本编辑器。功能强大:代码补全、编译及错误跳转等方便编程功能特别丰富,程序员中被广泛使用。...功能强大到其官方现在对自己定位是“程序开发工具”Vim 编辑器:三种模式 • 命令模式 • 编辑模式 • 末行模式命令模式• 用vim FILENAME进入之后默认模式 • 可以“上下左右”移动光标...上下翻页(forward/back)• gg:快速回到文档第一行第一个字符• G:快速到文件底部 (或者用 [ 和 ])剪切、复制与粘贴:• x:剪切一个字符• 10x:连续剪切10个字符(numberx...-- INSERT --提示) • 其实有多种进入模式(i/a/o/I/A/O),但是记住一种即可 • 按esc键退出该模式 • 在编辑模式下即可正常编辑、修改文本内容末行模式命令模式下输入一个:...进入这一模式 • 注意需要是英文冒号,中文冒号(全角)输入不进来 • 按esc键退出该模式 • 该模式下可以设置、查询、替换、保存并退出保存与退出• :wq 保存并退出• :q 直接退出• :q!

1.2K00

LinuxShell编程(2)

小姐姐照片一张 UNIX系统,Shell拥有一个强大特性:文件名替换。...$ *能够实现部分文件替换功能,它实际还可以与其他字符配合使用,以限制所能够匹配到文件名范围。...第二个echo,首个*能够匹配t字符之前任意多个字符,另一个*匹配t之后任意多个字符,因此,只要包含t文件名,就会被打印出来。...匹配两个字符,*匹配余下零个或多个字符,其效果就是找出所有文件名长度至少为两个字符文件。 另一种匹配单个字符方法是括号[]给出待匹配字符列表。例如,[abc]能够匹配字符a、b或c。...指定字符范围时候,唯一限制就是第一个字符字母表必须位于最后一个字符之前,因此[z-f]并不是一个有效字符范围,而[f-z]就没有问题。

78410

Windows系统Linux容器

Windows运行Docker,只需要一个很小Linux内核和用户空间来承载容器进程。这正是LinuxKit工具包设计初衷——创建安全、精简、可移植Linux子系统。.../pipe//docker_lcow" --data-root c:\lcow 接下来试试看吧 运行一个Linux容器: docker -H "npipe:////..../pipe//docker_lcow" run -ti busybox sh Docker刚刚启动了一个最小虚拟机,而这个虚拟机就是一个托管Linux容器运行LinuxKit实例!...届时,开发人员就能够同一系统同时运行两个平台容器,更轻松地构建、测试混合在Windows / Linux 两个操作系统Docker应用程序。...譬如,Windows系统Docker,将使Windows 服务器Docker企业版和可视化管理界面(依赖某些Linux独占组件)设置步骤变得更加简单。

4.9K60

Android 使用Canvas图片绘制文字方法

【Android】Android Paint 字体、粗细等属性一些设置 Android SDK中使用Typeface类来定义字体,可以通过常用字体类型名称进行设置,如设置默认黑体: Paint mp...Typeface.BOLD //粗体 * Typeface.BOLD_ITALIC //粗斜体 * Typeface.ITALIC //斜体 * Typeface.NORMAL //常规 但是有时上面那些设置绘图过程是不起作用...,再绘制文本时候一定要恢复到0 说明:对于中文粗体设置,好像只能通过setFakeBoldText(true)来实现,尽管效果看起来不是很实在(字体中空效果)。...一个小应用,图片绘制文字,以下是绘制文字方法,并且能够实现自动换行,字体自动适配屏幕大小 private void drawNewBitmap(ImageView imageView, String...canvas.translate(start_x, start_y); staticLayout.draw(canvas); } 以上这篇Android 使用Canvas图片绘制文字方法就是小编分享给大家全部内容了

4.3K20

Linux 使用 Multitail命令教程

基本 multitail 使用 multitail 最简单用法是命令行列出你要查看文件名称。此命令水平分割屏幕(即顶部和底部),并显示每个文件底部以及更新。...( 00 开始)、文件名、文件大小、最新内容添加日期和时间。...获得帮助 multitail 按下 h 将打开一个帮助菜单,其中描述了一些基本操作,但是手册页提供了更多信息,如果莫想了解更多有关使用此工具信息,请仔细阅读。...默认情况下,你系统不会安装 multitail,但是使用 apt-get 或 yum 可以使你轻松安装。该工具提供了许多功能,不过它是基于字符显示,窗口边框只是 q 和 x 字符串组成。...总结 以上所述是小编给大家介绍 Linux 使用 Multitail命令教程,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家

2.3K10

linux创建永久Bash别名

命令,使用 alias 创建别名 alias ll='ls -alh' 注意:等号前后不要有空格,不能写成 alias ll = 'ls -alh' 可以直接使用 alias 命令显示已经创建别名列表...,发现 ll 已经创建成功 删除别名 unalias name # name 为你要删除别名名称 unalias ll 再使用 alias 命令显示别名列表,发现 ll 已经成功删除 / 取消 alias...永久生效和永久删除 按照上面的操作,在当前终端下使用 alias 创建了别名,新启动终端竟然无效!!!...所以还是将 alias 添加到环境变量才能永久生效 Linux下 > vim ~/.bashrc # 将新建别名命令按行逐一写入,比如 alias ll='ls -alh' alias print=...source ~/.bash_profile使之生效 重启新终端,输入 print 测试,输出入门小站二字即为成功,或 输入 alias 查看内容 那要想永久删除就很简单了,再去编辑对应文件,将不需要那一行删除

1.6K10

Linux进阶 01 Linux文本编辑器 vim

今天跨入Linux进阶部分学习!主要包括vim编辑器以及集中生信常用文件格式介绍!...1 vim编辑器是什么大多数Linux都会自带文本编辑器2 vim编辑器三种模式2.1 命令模式用vim FILENAME进入之后默认模式可以“上下左右”移动光标可以剪切字符或整行,也可复制、粘贴...2.1.1 移动光标方向键/hjkl^和$:快速到所在行开头和末尾30j:向下移动30行(数字+方向进行快速移动)ctrl+f/ctrl+b:上下翻页(forward/back)gg:快速回到文档第一行第一个字符...后悔药)u:复原前一个动作(可连续撤销)ctrl+r:重做上一个动作2.2 编辑模式输入i后进入编辑模式(左下角有- - INSERT - -提示)按esc键退出该模式在编辑模式下即可正常地编辑、修改文本内容编辑模式下所有的快捷键失去功能...2.3 末行模式命令模式下输入一个:进入这一模式按esc键退出该模式该模式下可以设置、查询、替换、保存并退出末行模式要先回到命令模式才能进入!2.3.1 保存并退出wq:保存并退出q:直接退出q!

16110

CC++const用法区别

首先,CC++大体结构不同,却在语法上相同。  所以使用时候,我们会时常遇到一些莫名其妙问题,觉得语法是正确,但是编译时候却出现一个红色 error!...&var; 9 *p = 1; 10 printf("%d\n",var); 11 getchar(); 12 }  答案很定不用说:    1      原因也很简单:  C弱类型语言...,C++是强类型语言。  ...我们可以看到,var值,没有改变!  原因是C++是强类型语言,C++数据类型更加严格与苛刻 !      ...当然对于C++为何会出现指针值为*p=3而var=10这样情况,其实,*P所指常量地址真实内存已经修改了,但是编译器并没有内存地址取值,而是直接寄存器值,所以var=10依旧表面上依旧没有发生什么改变

72240

maven引用github资源

很多人选择Github开源项目,但很多开源项目要依赖一些自己写jar。如何让用户(使用者)可以通过互联网自动下载所依赖jar呢? ...下面介绍下通过GitHub做maven repository过程;  1、GitHub创建项目(这步操作不细说了,过程很简单,用过GitHub大家都懂)  例如:我创建项目名叫fengyunhe-wechat-mp...2、把本地maven项目Build,build生成maven文件夹上传到Giuhub  3、本地新建maven项目如果需要依赖jar,pom.xml增加  ...2、master 一定要写上,否则会无法下载  3、如果本地项目依赖groupId、artifactId跟本地项目中maven项目groupId、artifactId相对应,则会默认依赖本地项目而不去服务端下载...4、具体依赖项目 配置  groupId、artifactId 一定要与依赖项目的groupId、artifactId一致。

3.6K10

Linux安装和使用Docker方法

更好是,安装和使用 Docker Linux 平台上特别的方便。 我将会向你演示 Linux 安装 Docker 是多么方便,同时带你入门 Docker。...我演示平台是 Ubuntu 16.04 Server,但流程大多数其它 Linux 平台都差不多。 我这里假设你已经启动了 Ubuntu Server 16.04。...例如, Fedora 安装应该用命令: sudo dnf install docker 若你使用是 CentOS 7,那么最好使用安装脚本来安装 docker。...镜像注册仓库拉取,默认情况下安装好 Docker 包含了一个默认注册仓库 Docker Hub —— 这个注册仓库包含了大量别人所贡献镜像(既包括官方镜像,也包括用户自己贡献镜像)。...使用下面命令可以 Docker Hub 中下载 Nginx 镜像: docker pull nginx 上面命令会 Docker Hub 下载最新(官方) Nginx 镜像。

1.6K41
领券