要想实现图片或动画,首先和我们先要知道如何画点、画线、画矩形
注意:编写完代码后实现效果需要回到Ubuntu虚拟机最原始的页面:
这条博客有详细讲解怎么进入原始页面:
https://blog.csdn.net/qq_53287780/article/details/127130458?spm=1001.2014.3001.5501
运行步骤:
1、在终端输入init 3 使终端回到最原始的状态
2、输入密码:每个人ubuntu的密码不一样;我的是1
3、登陆的用户名:
4、密码再输一遍:
5、原始Ubuntu的终端页面;
6、编译及运行:回到文件所在的路径
gcc编译
./a.out运行
7、在原始终端输入 reboot/startx
就可以回到现在版本的Ubuntu界面)

进入正题:
第一步:
(已知条件:大屏幕由1176个像素点构成,小屏幕由800个像素点构成,图片大小为:

实现点的绘制

void draw_point(unsigned int *addr, int x, int y, unsigned int color)
{*(addr + 1176*y + x) = color;
}

实现线条的绘制

void draw_line(unsigned int *addr, int x, int y, int x1, int y1,unsigned int color)
{if(y == y1) //横线{while(x<=x1)draw_point(addr, x++,  y, color);}if(x == x1){while(y<=y1)draw_point(addr, x,  y++, color);}if(x-x1 == y-y1) //45度{while(y<=y1)draw_point(addr, x++,  y++, color);}
}

实现矩形的绘制

void draw_rect(unsigned int *addr, int x, int y, int x1, int y1,unsigned int color)
{draw_line(addr, x,  y, x1, y, color);//-draw_line(addr, x1,  y, x1, y1, color);//|draw_line(addr, x,  y1, x1, y1, color);draw_line(addr, x,  y, x, y1, color);
}

最后来实现图片的绘制


void draw_bmp(unsigned int *addr, int x, int y, const char *bmpname)
{//1. 打开图片int fd = open(bmpname, O_RDONLY);if(-1 == fd){perror("open bmp");return;}//2. 跳过54字节bmp头lseek(fd, 54, SEEK_SET);//3. 提取图像像素信息unsigned int buf[600][800];read(fd, buf, sizeof(buf));//4. 放入显存int i = 0;int j = 0;for(;i<600; i++){for(j=0; j<800; j++)draw_point(addr, j, i, buf[i][j]);}//5. 关闭文件close(fd);
}

主函数需要做的事情:

int main(int argc, char *argv[])
{int ret ;struct fb_var_screeninfo fbi_var;//定义可变参数struct fb_fix_screeninfo fbi_fix;//定义固定参数struct fb_cmap cmap;//打开屏幕设备int fd = open("/dev/fb0",O_RDWR);if(fd < 0){perror("open");close(fd);}//得到虚拟屏幕参数ret = ioctl(fd,FBIOGET_VSCREENINFO,&fbi_var);if(ret < 0){perror("ioctl");return -1;}printf("fbi.var.xres:%u ,fbi.var.yres:%u ,var.bpp:%d\n",fbi_var.xres ,fbi_var.yres,fbi_var.bits_per_pixel);printf("fbi.var.xoffset:%u ,fbi.var.yoffset:%u\n",fbi_var.xoffset ,fbi_var.yoffset);//得到实际屏幕参数ret = ioctl(fd,FBIOGET_FSCREENINFO,&fbi_fix);if(ret < 0){perror("ioctl");return -1;}printf("fbi.fix.smem_start:%lu ,fbi.fix.smem_len:%u\n",fbi_fix.smem_start ,fbi_fix.smem_len);printf("line_length: %u\n",fbi_fix.line_length);//获取显存起始地址unsigned int *addr = mmap(NULL,fbi_fix.smem_len,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);if(addr == NULL){perror("mmap");ret = munmap(addr,fbi_fix.smem_len);return -1;}while(1){draw_bmp(addr, 0, 0, "1.bmp");//图片名字:1.bmp 2.bmp需要放在和代码所在的文件夹下sleep(1);draw_bmp(addr, 0, 0, "2.bmp");sleep(1);}while(1){draw_rect(addr, rand()%800, rand()%600,rand()%800, rand()%600, rand());usleep(100000);}close(fd);return 0;
}

所有的代码再发一次:

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <errno.h>
#include <stdio.h>
#include <linux/fb.h>
#include <sys/mman.h>
#include <time.h>
#include <sys/time.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>void draw_point(unsigned int *addr, int x, int y, unsigned int color)
{*(addr + 1176*y + x) = color;
}void draw_line(unsigned int *addr, int x, int y, int x1, int y1,unsigned int color)
{if(y == y1) //横线{while(x<=x1)draw_point(addr, x++,  y, color);}if(x == x1){while(y<=y1)draw_point(addr, x,  y++, color);}if(x-x1 == y-y1) //45度{while(y<=y1)draw_point(addr, x++,  y++, color);}
}void draw_bmp(unsigned int *addr, int x, int y, const char *bmpname)
{//1. 打开图片int fd = open(bmpname, O_RDONLY);if(-1 == fd){perror("open bmp");return;}//2. 跳过54字节bmp头lseek(fd, 54, SEEK_SET);//3. 提取图像像素信息unsigned int buf[600][800];read(fd, buf, sizeof(buf));//4. 放入显存int i = 0;int j = 0;for(;i<600; i++){for(j=0; j<800; j++)draw_point(addr, j, i, buf[i][j]);}//5. 关闭文件close(fd);
}void draw_rect(unsigned int *addr, int x, int y, int x1, int y1,unsigned int color)
{draw_line(addr, x,  y, x1, y, color);//-draw_line(addr, x1,  y, x1, y1, color);//|draw_line(addr, x,  y1, x1, y1, color);draw_line(addr, x,  y, x, y1, color);
}int main(int argc, char *argv[])
{int ret ;struct fb_var_screeninfo fbi_var;//定义可变参数struct fb_fix_screeninfo fbi_fix;//定义固定参数struct fb_cmap cmap;//打开屏幕设备int fd = open("/dev/fb0",O_RDWR);if(fd < 0){perror("open");close(fd);}//得到虚拟屏幕参数ret = ioctl(fd,FBIOGET_VSCREENINFO,&fbi_var);if(ret < 0){perror("ioctl");return -1;}printf("fbi.var.xres:%u ,fbi.var.yres:%u ,var.bpp:%d\n",fbi_var.xres ,fbi_var.yres,fbi_var.bits_per_pixel);printf("fbi.var.xoffset:%u ,fbi.var.yoffset:%u\n",fbi_var.xoffset ,fbi_var.yoffset);//得到实际屏幕参数ret = ioctl(fd,FBIOGET_FSCREENINFO,&fbi_fix);if(ret < 0){perror("ioctl");return -1;}printf("fbi.fix.smem_start:%lu ,fbi.fix.smem_len:%u\n",fbi_fix.smem_start ,fbi_fix.smem_len);printf("line_length: %u\n",fbi_fix.line_length);//获取显存起始地址unsigned int *addr = mmap(NULL,fbi_fix.smem_len,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);if(addr == NULL){perror("mmap");ret = munmap(addr,fbi_fix.smem_len);return -1;}while(1){draw_bmp(addr, 0, 0, "1.bmp");sleep(1);draw_bmp(addr, 0, 0, "2.bmp");sleep(1);}while(1){draw_rect(addr, rand()%800, rand()%600,rand()%800, rand()%600, rand());usleep(100000);}close(fd);return 0;
}

运行结果:
以下两张图片交替出现

纯C语言实现图片与动画相关推荐

  1. 纯html5语言编写的动画,8个纯CSS3制作的动画应用及源码

    本文作者html5tricks,转载请注明出处 对于一个复杂的图形或者动画来说,之前我们的处理方式是图片叠加或者利用CSS+JavaScript的方法,然而随着CSS3标准的不断成熟,我们甚至完全可以 ...

  2. linux c语言 电子相册,纯C语言开发(电子相册).doc

    纯C语言开发(电子相册) PAGE PAGE 4 毕 业 论 文 课 题:(C语言)电子相册 摘要:对于java,.net,C++等一些面向对象的语言来说,结合相应的开发工具做出一个电子相册并非难事, ...

  3. c语言窗口插入图片,c语言添加图片Word版

    <c语言添加图片Word版>由会员分享,可在线阅读,更多相关<c语言添加图片Word版(10页珍藏版)>请在人人文库网上搜索. 1.传播优秀Word版文档 ,希望对您有帮助,可 ...

  4. 纯css实现正方体图片旋转效果

    纯css实现正方体图片旋转效果 目标效果 基本思路 代码实现 主要困难 注意:(该代码暂未解决兼容性问题,在google浏览器中可顺利运行) 目标效果 鼠标移入之后,图片开始依次旋转平移,旋转平移完成 ...

  5. 纯前端语言编写音乐播放器

    纯前端语言编写音乐播放器 html代码 index.html <!DOCTYPE html> <html lang="en"><head>< ...

  6. c语言窗口贴图,c语言添加图片

    <c语言添加图片>由会员分享,可在线阅读,更多相关<c语言添加图片(10页珍藏版)>请在人人文库网上搜索. 1.3.1背景如何实现首先将制作好的背景图片("BackG ...

  7. 拐道交叉的css3动画,CSS3图片翻转动画技术详解

    CSS动画非常的有趣:这种技术的美就在于,通过使用很多简单的属性,你能创建出漂亮的消隐效果.其中代表性的一种就是CSS图片翻转效果,能让你看到一张卡片的正反两面上的内容.本文就是要用最简单的方法向大家 ...

  8. html动画图片重叠,CSS3炫酷堆叠图片展示动画特效

    这是一款效果的CSS3炫酷堆叠图片展示动画特效.该堆叠图片展示效果是将一组图片堆叠在一起,然后以各种CSS动画效果来切换最上面的一张图片.该特效将使用纯CSS3制作,它可以在所有现代浏览器和移动设备上 ...

  9. 18种各式各样的loading,纯html5+css3无图片

    网友总结的18种各式各样的loading,纯html5+css3无图片,我再次整理下 <!DOCTYPE html> <html lang='zh_CN'> <head& ...

最新文章

  1. 文巾解题1738. 找出第 K 大的异或坐标值
  2. 数字图像处理:第九章 线性系统、卷积、傅立叶变换
  3. 蓝桥杯-题目:猜算式
  4. Linux下bash的PS1
  5. VM虚拟机 安装OS X 错误vcpu-0:VERIFY vmcore/vmm/main/physMem_monitor.c:1123
  6. java中死锁_关于java中死锁的总结
  7. web前端最全各类资源
  8. 专栏推荐丨Oracle Database 21c 专栏
  9. 第三章 寄存器(内存访问)
  10. 文件夹在哪里_在Mac电脑上截图和照片放在哪里?
  11. 28335scififo中断接收与发送
  12. Writing an ALSA Driver(二)
  13. 灵活的Zend Framework之使用自定义的Frontcontroller
  14. java中的耦合_Java中的耦合
  15. jw player 6 断点续播 seek()
  16. RK3066 遥控器调试流程
  17. 从产业图谱看中国2020年数据智能行业的发展态势
  18. 新松机器人招股说明书_来看看绿的谐波招股书披露的重要信息
  19. C++右值引用与函数返回值
  20. Cathy Zhang automation test

热门文章

  1. nvidia显卡Tesla查看GPU使用情况
  2. onepunch的wp
  3. 如何使用AE制作文字破碎动画?制作ae破碎文字特效教程分享
  4. deepin 下 WPS for linux字体显示问题[已解决]
  5. 转载 PVE 防火墙
  6. C语言_函数可变参数列表
  7. ROS通信机制:话题、服务、参数
  8. rtmp/rtsp测试地址 2019/11/22日亲测可用
  9. 互联网人没有想多——互联网人能当中国的新中产的机遇和挑战
  10. 笔记本计算机无线开关在哪里,笔记本的WIFI开关在哪里 笔记本WIFI打开方法