首页 > 系统相关 >Linux 显示 bmp 错位(宽度不能被4整除问题)

Linux 显示 bmp 错位(宽度不能被4整除问题)

时间:2023-09-05 17:12:32浏览次数:45  
标签:字节 pic bmp depth Linux byte 整除

主要参考文章:《gec6818_液晶屏显示bmp图片》

辅助参考文章:《关于bmp图片倾斜的解决方法》

 

24位bmp格式图片的编码特点:

  1. 每个像素点占3个字节存放的BGR数据  B蓝色  G绿色  R红色。(不是RGB)
  2. 图片的宽度占用的字节数如果不能被4整除,window系统会给每一行尾端填充垃圾数凑够4字节整除。

                           

如示例图中一张750*450的bmp图片,每一行的数据应该是750x3 = 2250字节,但2250不能被4整除,所以系统会自动在每一行后面补齐2个字节数据,达到2252字节,这样图片的长就被拉长了,就会出现倾斜现象。

 

那么如何解决这个问题呢,原博这样解决:

//判断宽度是否能被4整除
	if(width%4==0){
		//被4整除,一下子读完
		read(bmpfd,bmpbuf,width*height*3);
	}else{
		//不被4整除,一行一行读
		//每行读到最后(width),设置当前往后偏移(宽%4的余数)
		for(i=0;i<height;i++){
			read(bmpfd,bmpbuf+i*width*3,width*3);
			lseek(bmpfd,width%4,SEEK_CUR); //跳过垃圾数据
		}
	}

 是通过 lseek(bmpfd,width%4,SEEK_CUR); 跳过垃圾数据实现的。

 

原博的程序不太严谨,仅仅考虑了 width(图片宽度),而没算进去 byte_depth(图片颜色深度),因此我小小修改如下:

//检查图片宽度字节数是否能被4整除
div4_mod = (pic_w * byte_depth)%4;  //算进去 byte_depth(图片颜色深度)
printf("div4_mod = %d\n", div4_mod);

//读bmp一行的数据,读取的字节数为pic_w*byte_depth
if(div4_mod == 0) //如果图片宽度字节不为4整除,那么用 lseek() 跳过补充字节
{
    if(pic_w*byte_depth != read(fpic, line_buf, pic_w*byte_depth))
    {
        perror("read failed!");
        exit(-1);
    }
}else
{
    if(pic_w*byte_depth != read(fpic, line_buf, pic_w*byte_depth))
    {
        perror("read failed!");
        exit(-1);
    }
    lseek(fpic, div4_mod, SEEK_CUR);//lseek() 跳过补充字节
}

 

标签:字节,pic,bmp,depth,Linux,byte,整除
From: https://www.cnblogs.com/FBsharl/p/17680183.html

相关文章

  • 人大金仓 错误提示“致命错误:对不起,已经有太多的客户”解决方案 以及linux替换授权文
    项目需要,头一次接触人大金仓(友情提示,可以使用navicat连接哟)。使用连接工具报“对不起,已经有太多的客户”错误,java程序也是如此,找到数据库的kingbase.conf配置文件修改max_connections属性,重启。ok了。。。。。。。。。。。。。。。。。。。个锤子,这是理想情况。不理想情况:重......
  • linux逻辑卷LVM的建立
    1、建立逻辑卷fdisk-l                    显示磁盘信息pvcreate/dev/vda2          创建物理卷pvdisplay                   显示物理卷信息vgcreate-s16Mvg2/dev/vda2 ......
  • Linux中修改文件权限的命令是什么?
    在Linux系统中,修改文件权限的命令主要有chmod、chgrp、chown。其中chmod是Linux中一个常用的文件权限管理命令,它可以用来更改文件或目录的读写执行权限,接下来我们通过这篇文章详细介绍一下chmod命令。在Linux系统中,修改文件权限的命令是chmod。通过该命令,用户可以更改文件......
  • Linux rocketmq单机测试部署
    一.环境说明对于RocketMQ4.3.0版本,官方要求环境如下,其中Git用于从GitHub获取源码,没有安装也没关系,可以直接下载推荐的流程是:Linux系统上安装Git工具、Maven、JavaJDKGit工具用于直接从GitHub获取RocketMQ项目源码下载到Linux系统上然后Maven将RocketMQ源码......
  • Linux jenkins安装
    介绍Jenkins是一个自包含的、开源的自动化服务器,可用于自动化与构建、测试和交付或部署软件相关的各种任务。Jenkins可以通过本地系统包、Docker安装,甚至可以通过任何已安装Java运行时环境(JRE)的计算机独立运行。安装命令sudowget-O/etc/yum.repos.d/jenkins.repo......
  • linux 下安装使用jmeter 执行压测
    1、下载地址https://jmeter.apache.org/我这下载的版本是5.2.1登录服务器mkdir/app/jmetercd/app/jmeterwgethttps://dlcdn.apache.org//jmeter/binaries/apache-jmeter-5.2.1.tgz解压tar-zxvfapache-jmeter-5.2.1.tgz解压后,在同目录下有文件夹 apache-jmet......
  • Linux安装maven
     安装maven环境前,需要先安装java环境,笔者这里已经成功安装java环境,如果没有安装java环境,可以参考:https://blog.csdn.net/wsjzzcbq/article/details/828188261、maven官网下载安装包maven官网地址:https://maven.apache.org/download.cgi下载完成后,上传到linux2、......
  • linux 安装java环境
    第一步,下载server-jre-8u202-linux-x64.tar.gz安装包。登录网址:https://www.oracle.com/java/technologies/javase/javase8-archive-downloads.html(1)下载server-jre-8u202-linux-x64.tar.gz安装包,然后使用WinSCP将安装包上传到/usr/local/src文件夹中。(2)也可以使用wget命令下载......
  • Linux学习
    一、Linux版本及其特性版本名称网址特点软件包管理器DebianLinuxwww.debian.org开放的开发模式,且易于进行软件包升级aptFedoraCorewww.redhat.com拥有数量庞人的用户,优秀的社区技术支持.并且有许多创新up2date(rpm),yum(rpm)CentOSwww.centos.orgCentOS是一......
  • Linux恢复误删除的文件或者目录(处理二)
    Linux恢复误删除的文件或者目录对于误删文件还原可以分为两种情况:   1.一种是删除以后在进程存在删除信息   2.一种是删除以后进程都找不到,只有借助于工具还原。误删除文件进程还在的情况::一般是有活动的进程存在持续标准输入或输出,到时文件被删除后,进程PID依旧......