纯C语言实现图片与动画
要想实现图片或动画,首先和我们先要知道如何画点、画线、画矩形
注意:编写完代码后实现效果需要回到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语言实现图片与动画相关推荐
- 纯html5语言编写的动画,8个纯CSS3制作的动画应用及源码
本文作者html5tricks,转载请注明出处 对于一个复杂的图形或者动画来说,之前我们的处理方式是图片叠加或者利用CSS+JavaScript的方法,然而随着CSS3标准的不断成熟,我们甚至完全可以 ...
- linux c语言 电子相册,纯C语言开发(电子相册).doc
纯C语言开发(电子相册) PAGE PAGE 4 毕 业 论 文 课 题:(C语言)电子相册 摘要:对于java,.net,C++等一些面向对象的语言来说,结合相应的开发工具做出一个电子相册并非难事, ...
- c语言窗口插入图片,c语言添加图片Word版
<c语言添加图片Word版>由会员分享,可在线阅读,更多相关<c语言添加图片Word版(10页珍藏版)>请在人人文库网上搜索. 1.传播优秀Word版文档 ,希望对您有帮助,可 ...
- 纯css实现正方体图片旋转效果
纯css实现正方体图片旋转效果 目标效果 基本思路 代码实现 主要困难 注意:(该代码暂未解决兼容性问题,在google浏览器中可顺利运行) 目标效果 鼠标移入之后,图片开始依次旋转平移,旋转平移完成 ...
- 纯前端语言编写音乐播放器
纯前端语言编写音乐播放器 html代码 index.html <!DOCTYPE html> <html lang="en"><head>< ...
- c语言窗口贴图,c语言添加图片
<c语言添加图片>由会员分享,可在线阅读,更多相关<c语言添加图片(10页珍藏版)>请在人人文库网上搜索. 1.3.1背景如何实现首先将制作好的背景图片("BackG ...
- 拐道交叉的css3动画,CSS3图片翻转动画技术详解
CSS动画非常的有趣:这种技术的美就在于,通过使用很多简单的属性,你能创建出漂亮的消隐效果.其中代表性的一种就是CSS图片翻转效果,能让你看到一张卡片的正反两面上的内容.本文就是要用最简单的方法向大家 ...
- html动画图片重叠,CSS3炫酷堆叠图片展示动画特效
这是一款效果的CSS3炫酷堆叠图片展示动画特效.该堆叠图片展示效果是将一组图片堆叠在一起,然后以各种CSS动画效果来切换最上面的一张图片.该特效将使用纯CSS3制作,它可以在所有现代浏览器和移动设备上 ...
- 18种各式各样的loading,纯html5+css3无图片
网友总结的18种各式各样的loading,纯html5+css3无图片,我再次整理下 <!DOCTYPE html> <html lang='zh_CN'> <head& ...
最新文章
- 文巾解题1738. 找出第 K 大的异或坐标值
- 数字图像处理:第九章 线性系统、卷积、傅立叶变换
- 蓝桥杯-题目:猜算式
- Linux下bash的PS1
- VM虚拟机 安装OS X 错误vcpu-0:VERIFY vmcore/vmm/main/physMem_monitor.c:1123
- java中死锁_关于java中死锁的总结
- web前端最全各类资源
- 专栏推荐丨Oracle Database 21c 专栏
- 第三章 寄存器(内存访问)
- 文件夹在哪里_在Mac电脑上截图和照片放在哪里?
- 28335scififo中断接收与发送
- Writing an ALSA Driver(二)
- 灵活的Zend Framework之使用自定义的Frontcontroller
- java中的耦合_Java中的耦合
- jw player 6 断点续播 seek()
- RK3066 遥控器调试流程
- 从产业图谱看中国2020年数据智能行业的发展态势
- 新松机器人招股说明书_来看看绿的谐波招股书披露的重要信息
- C++右值引用与函数返回值
- Cathy Zhang automation test