c语言BMP图片左下50 50,linu下C语言之BMP图片操作编程(上)

BMP文件格式,也被称为位图图像文件或与设备无关的位图文件格式(DIB)或者只是一个位图,是 一个光栅图形图像文件格式使用 来存储位图,数字,图片,独立的显示设备。

微软已经定义了一个特定的表示颜色的位图 不同的颜色深度,作为援助交换设备和之间的位图 应用程序与各种各样的内部表示。 他们称这些 与设备无关的位图或权利,叫做DIB文件格式 文件格式或BMP图像文件格式。 根据微软的支持:

与设备无关的位图(DIB)是一种用于定义格式 与设备无关的位图在各种颜色的决议。 的主要目的 权利是允许从一个设备转移到另一个位图(因此, 与设备无关的名字)的一部分。 DIB外部格式,形成鲜明对比 设备相关的位图,在系统作为一个位图对象 应用程序创建的(……)。 元的DIB通常运输 (通常使用StretchDIBits()函数),BMP文件,剪贴板 (CF_DIB数据格式)。

BMP图片格式图:

aa0758aed59f74d5974b2fdb85e28fce.png

接下来来看一个代码对BMP头的封装,然后将rgb888转化成rgb565的现象的例程:

#include

#include

#include

#define RGB(r,g,b) (((r>>3)<<11)|((g>>2)<<5)|(b>>3))

typedef unsigned char U8 ;

typedef unsigned short U16 ;

typedef unsigned int U32 ;

#pragma pack(1)

struct bmp_header //这个结构体就是对上面那个图做一个封装。

{

//bmp header

U8 Signatue[2] ; // B M

U32 FileSize ; //文件大小

U16 Reserv1 ;

U16 Reserv2 ;

U32 FileOffset ; //文件头偏移量

//DIB header

U32 DIBHeaderSize ; //DIB头大小

U32 ImageWidth ; //文件宽度

U32 ImageHight ; //文件高度

U16 Planes ;

U16 BPP ; //每个相素点的位数

U32 Compression ;

U32 ImageSize ; //图文件大小

U32 XPPM ;

U32 YPPM ;

U32 CCT ;

U32 ICC ;

};

#pragma pack()

int main(int argc , char **argv)

{

//判断参数,传进来的参数不等于两个,那么就报错 ./a.out xxx

if(argc != 2)

return -1 ;

int fd ;

int dest_fd ;

//以只读的方式打开一个文件 这个文件是rgb888

fd = open(argv[1] , O_RDONLY);

if(-1 == fd)

{

perror("open bmp file fail");

return -2 ;

}

//打开一个rgb565.bmp的图片

dest_fd = open("rgb565.bmp" , O_RDWR | O_CREAT|O_TRUNC , 0777);

if(dest_fd < 0 )

{

perror("open rgb565 fail");

return -3 ;

}

//定义一个bmp的头

struct bmp_header header ;

int ret ;

//读出bmp文件头的数据

ret = read(fd , &header , sizeof(struct bmp_header));

//以下是bmp图的相关数据

printf(" Signatue[0] : %c \n " , header.Signatue[0] );

printf(" Signatue[1] : %c \n " , header.Signatue[1] );

printf(" FileSize : %d \n " , header.FileSize );

printf(" Reserv1 : %d \n " , header.Reserv1 );

printf(" Reserv2 : %d \n " , header.Reserv2 );

printf(" FileOffset : %d \n " , header.FileOffset );

printf(" DIBHeaderSize : %d \n " , header.DIBHeaderSize);

printf(" ImageWidth : %d \n " , header.ImageWidth );

printf(" ImageHight : %d \n " , header.ImageHight );

printf(" Planes : %d \n " , header.Planes );

printf(" BPP : %d \n " , header.BPP );

printf(" Compression : %d \n " , header.Compression );

printf(" ImageSize : %d \n " , header.ImageSize );

printf(" XPPM : %d \n " , header.XPPM );

printf(" YPPM : %d \n " , header.YPPM );

printf(" CCT : %d \n " , header.CCT );

printf(" ICC : %d \n " , header.ICC );

char buffer[header.ImageSize] ;

read(fd , buffer , header.ImageSize);

close(fd);

//改变地方

header.BPP = 16 ;

header.FileSize = header.ImageWidth*header.ImageHight*2+54 ;

header.ImageSize = header.ImageWidth*header.ImageHight*2;

write(dest_fd , &header , sizeof(struct bmp_header));

int row , col ;

short data ;

char *p = NULL ;

for(row = 0 ; row < header.ImageHight ; row++)

{

for(col = 0 ; col < header.ImageWidth ; col++)

{

p =( buffer+(row*header.ImageWidth + col)*3);

data = RGB((unsigned char)(*(p+2)) , (unsigned char)(*(p+1)) ,

(unsigned char )(*(p)));

write(dest_fd , &data , 2);

}

}

close(dest_fd);

return 0 ;

}

接下来我们来对这幅图进行操作,看看打印出什么信息:这副图就是1.bmp----->格式rgb888

mad.gif

33a9ab9735aee2cbce2f69edeaae1ca0.bmp

运行结果:获取到bmp图的包头,顺便将rgb888的bmp图转化为rgb565

mad.gif

7850690974c8913be0d96d09d1870190.png

生成rgb565的bmp图:是不是发现像素差了一点?

laugh.gif

2b7d0e6e827ebc988edd959555e41b2f.bmp

后续还会有bmp图相关的操作,例如BMP图旋转(左右转),bmp图的灰度处理

,欢迎继续关注Bruce.yang的嵌入式之旅

laugh.gif

本文同步分享在 博客“Engineer-Bruce_Yang”(CSDN)。

如有侵权,请联系 support@oschina.cn 删除。

本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
代码下载:完整代码,可直接运行 ;运行版本:2022a或2019b或2014a;若运行有问题,可私信博主; **仿真咨询 1 各类智能优化算法改进及应用** 生产调度、经济调度、装配线调度、充电优化、车间调度、发车优化、水库调度、三维装箱、物流选址、货位优化、公交排班优化、充电桩布局优化、车间布局优化、集装箱船配载优化、水泵组合优化、解医疗资源分配优化、设施布局优化、可视域基站和无人机选址优化 **2 机器学习和深度学习方面** 卷积神经网络(CNN)、LSTM、支持向量机(SVM)、最小二乘支持向量机(LSSVM)、极限学习机(ELM)、核极限学习机(KELM)、BP、RBF、宽度学习、DBN、RF、RBF、DELM、XGBOOST、TCN实现风电预测、光伏预测、电池寿命预测、辐射源识别、交通流预测、负荷预测、股价预测、PM2.5浓度预测、电池健康状态预测、水体光学参数反演、NLOS信号识别、地铁停车精准预测、变压器故障诊断 **3 图像处理方面** 图像识别、图像分割、图像检测、图像隐藏、图像配准、图像拼接、图像融合、图像增强、图像压缩感知 **4 路径规划方面** 旅行商问题(TSP)、车辆路径问题(VRP、MVRP、CVRP、VRPTW等)、无人机三维路径规划、无人机协同、无人机编队、机器人路径规划、栅格地图路径规划、多式联运运输问题、车辆协同无人机路径规划、天线线性阵列分布优化、车间布局优化 **5 无人机应用方面** 无人机路径规划、无人机控制、无人机编队、无人机协同、无人机任务分配 **6 无线传感器定位及布局方面** 传感器部署优化、通信协议优化、路由优化、目标定位优化、Dv-Hop定位优化、Leach协议优化、WSN覆盖优化、组播优化、RSSI定位优化 **7 信号处理方面** 信号识别、信号加密、信号去噪、信号增强、雷达信号处理、信号水印嵌入提取、肌电信号、脑电信号、信号配时优化 **8 电力系统方面** 微电网优化、无功优化、配电网重构、储能配置 **9 元胞自动机方面** 交通流 人群疏散 病毒扩散 晶体生长 **10 雷达方面** 卡尔曼滤波跟踪、航迹关联、航迹融合
Linux服务器上设置Redis开机自启动,需要进行以下步骤: 1. 编写Redis服务脚本 在Linux系统中,服务的启动和停止是要通过服务脚本来完成的,因此我们需要编写一个Redis服务脚本,以实现Redis开机自启动。 在终端中输入以下命令,创建Redis服务脚本: ``` sudo nano /etc/init.d/redis-server ``` 在打开的文件中,输入以下内容: ``` #!/bin/sh # chkconfig: 2345 95 05 # description: Redis is a persistent key-value database # Source function library. . /etc/rc.d/init.d/functions REDISPORT=6379 EXEC=/usr/local/bin/redis-server CLIEXEC=/usr/local/bin/redis-cli PIDFILE=/var/run/redis_${REDISPORT}.pid CONF="/etc/redis/${REDISPORT}.conf" [ -f /etc/sysconfig/redis ] && . /etc/sysconfig/redis RETVAL=0 start() { echo -n $"Starting Redis server on port ${REDISPORT}: " daemon ${EXEC} ${CONF} RETVAL=$? echo [ $RETVAL -eq 0 ] && touch /var/lock/subsys/redis return $RETVAL } stop() { echo -n $"Stopping Redis server on port ${REDISPORT}: " killproc -p ${PIDFILE} ${EXEC} RETVAL=$? echo [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/redis return $RETVAL } restart() { stop start } case "$1" in start) start ;; stop) stop ;; restart) restart ;; *) echo $"Usage: $0 {start|stop|restart}" exit 1 esac exit $RETVAL ``` 上述代码中,需要注意以下几点: - REDISPORT:Redis服务监听的端口号,需要根据实际情况进行修改。 - EXEC:Redis服务启动程序的路径,需要根据实际情况进行修改。 - CLIEXEC:Redis服务停止命令。 - PIDFILE:Redis服务进程的PID文件路径。 - CONF:Redis服务配置文件路径。 - start、stop、restart:启动、停止、重启Redis服务的命令。 2. 将Redis服务脚本添加到系统服务中 在终端中输入以下命令,将Redis服务脚本添加到系统服务中: ``` sudo chmod +x /etc/init.d/redis-server sudo chkconfig --add redis-server sudo chkconfig --level 345 redis-server on ``` 3. 重启系统,验证Redis服务是否已经自启动 在终端中输入以下命令,重启系统: ``` sudo reboot ``` 重启完成后,可以使用以下命令来检查Redis服务是否已经自启动: ``` ps aux | grep redis ``` 如果能看到Redis服务的进程,则说明Redis已经成功地自启动了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值