matlab图片取模程序,彩屏图像取模,BMP图像提取程序示例 | 学步园

//bmconv.c

#include #include#include#include"bmconv.h"

/*************************************************************************

文件名称:bmconv.c/bmconv.h

文件功能:BMP提取到点阵RGB显示

创建时间:2013-04-20

文件作者:女孩不哭

文件版本:1.0

文件说明:专用

*************************************************************************/__inline unsignedint myrgb(inta)

{

unsignedshort b = (a&0xff)>>3;

unsignedshort g = ((a&0xff00)>>10);

unsignedshort r = ((a&0xff0000)>>19);

unsignedint rgb = (b|(g<<5)|(r<<11));returnrgb;

}int main(void)

{char file[260];char file_out[260];char* pstr =NULL;

unsignedchar* buffer=NULL;char* outout_data =NULL;

BITMAP_FILE_HEADER bmfh={0};

BITMAP_INFO_HEADER bmih={0};

FILE* fpin =NULL;

FILE* fpout =NULL;

size_t size= 0;

size_t file_size;

printf("输入BMP文件打开路径:");

fgets(file,sizeof(file),stdin);

pstr= strrchr(file,'\n');if(pstr) *pstr = 0;

printf("输入BMP文件保存路径:");

fgets(file_out,sizeof(file_out),stdin);

pstr= strrchr(file_out,'\n');if(pstr) *pstr = 0;

fpin= fopen(file,"rb");if(fpin==NULL){

fprintf(stderr,"打开输入文件错误!\n");return 1;

}

fpout= fopen(file_out,"wb");if(fpout==NULL){

fprintf(stderr,"打开输出文件错误!\n");

fclose(fpin);return 1;

}

fseek(fpin,0,SEEK_END);

file_size=ftell(fpin);

fseek(fpin,0,SEEK_SET);

size= fread(&bmfh,1,sizeof(bmfh),fpin);if(size != sizeof(bmfh)){

fclose(fpin);

fprintf(stderr,"读取文件头时错误!\n");return 1;

}if(bmfh.signature[0]!='B' || bmfh.signature[1]!='M'){

fclose(fpin);

fprintf(stderr,"不是BMP文件!\n");return 1;

}

printf("文件头结构体大小:%d\n"

"文件头签名:\'BM\'\n"

"文件大小:%u bytes\n"

"保留4字节值:%u\n"

"位图数据距文件开始的偏移:%u\n\n",(long)sizeof(bmfh),

bmfh.file_size,bmfh._reserved1,bmfh.data_offset);

size= fread(&bmih,1,sizeof(bmih),fpin);if(size != sizeof(bmih)){

fclose(fpin);

fprintf(stderr,"读取图像信息头错误!\n");return 1;

}

printf("图像信息头结构体大小:%d\n"

"图像信息头大小:%d bytes\n"

"位图宽度: %u 像素\n"

"位图高度: %u 像素\n"

"位图面数: %d 面\n"

"位深: %d bpp\n"

"压缩说明: %d\n"

"位图数据大小: %u bytes\n"

"水平分辨率: %u 像素/米\n"

"垂直分辨率: %u 像素/米\n"

"使用的颜色数: %u\n"

"重要的颜色数: %u\n\n",(long)sizeof(bmih),

bmih.header_size,bmih.width,bmih.height,bmih.planes,bmih.bpp,bmih.compress,

bmih.data_size,bmih.hresolution,bmih.vresolution,bmih.colors,bmih.colors_important);//检测文件数据大小是否符合文件头

size = bmih.width*3;

size+= size%4==0?0:4-size%4;

size*=bmih.height;if(size != file_size-bmfh.data_offset){

fprintf(stderr,"位图的数据量与文件头所标识的数据量的长度不一致!\n");

fclose(fpin);return 1;

}if(bmih.bpp != 24){

fprintf(stderr,"不是24位位深的BMP位图,不被支持!\n");

fclose(fpin);return 1;

}

buffer=(unsigned char*)malloc(size);//printf("buffer大小:%d\n",size);

if(buffer==NULL){

fprintf(stderr,"分配文件缓冲区时出错!\n");

fclose(fpin);return 1;

}if(size != fread(buffer,1,size,fpin)){

fprintf(stderr,"读取位图数据时读取的长度不一致!\n");

free(buffer);

fclose(fpin);return 1;

}

fclose(fpin);//交换上下内存

for(;;){int bytes_line = size/bmih.height;int rows = bmih.height/2;int it=0;

unsignedchar* tmp = (unsigned char*)malloc(bytes_line);while(it

memcpy(tmp,buffer+bytes_line*it,bytes_line);

memcpy(buffer+bytes_line*it,buffer+(bmih.height-1-it)*bytes_line,bytes_line);

memcpy(buffer+(bmih.height-1-it)*bytes_line,tmp,bytes_line);

it++;

}

free(tmp);break;

}//总像素点个数(一个像素3个字节),3个字节转换成2个字节,2个字节转成字符串需要7个字节空间(0x0000,)//每行后面1个换行符(每行16个"0x0000,",2个字节),字符串开始的结束的字符串("unsigned char image[] = {" + 换行 + "};"

for(;;){

size_t pixels= bmih.width*bmih.height;

size_t str_length= pixels*7;

size_t crlf_count= pixels/16 + (pixels%16==0?0:1);

size_t prefix_length= sizeof("unsigned short image[] = {\r\n")-1 + sizeof("};\r\n")-1;

size_t total= str_length+crlf_count*2+prefix_length+1;

outout_data= (char*)malloc(total);//printf("str:%d,crlf:%d,prefix:%d,total::%d\n",str_length,crlf_count*2,prefix_length,total);

if(outout_data ==NULL){

fprintf(stderr,"申请保存数据用的缓冲区失败!\n");

free(buffer);return 1;

}

printf("正在生成数据...\n");for(;;){char* ptr =outout_data;

unsignedchar* pbuf =buffer;int count = 0;

unsignedlonglines;int skip = (bmih.width*3%4)?(4-bmih.width*3%4):0;intlen;

len=sprintf(ptr,"unsigned short image[] = {\r\n");

ptr+=len;for(lines=0;lines

len=sprintf(ptr,"0x%04X,",(unsigned short)myrgb(*(int*)pbuf));

ptr+=len;

count++;if(count == 16){

count= 0;

len=sprintf(ptr,"\r\n");

ptr+=len;

}

pbuf+= 3;if((unsigned long)pbuf-(unsigned long)buffer-lines*skip == bmih.width*3*(lines+1)){

pbuf+=skip;

lines++;

}

}if(count==0){

ptr-= 3;

len=sprintf(ptr,"\r\n");

ptr+=len;

}else{--ptr;

len=sprintf(ptr,"\r\n");

ptr+=len;

}

len=sprintf(ptr,"};\r\n");

ptr+=len;

printf("生成成功!\n");//printf("结尾指针:pbuf-buffer=%d,ptr-outout_data=%d\n",pbuf-buffer,ptr-outout_data);

len=fwrite(outout_data,1,(unsigned long)ptr-(unsigned long)outout_data,fpout);if(len != (unsigned long)ptr-(unsigned long)outout_data){

fprintf(stderr,"写入数据的长度不等于待写入的要求!\n");

}else{

printf("已全部保存到文件!\n");

}

fclose(fpout);

free(buffer);

free(outout_data);break;

}break;

}return 0;

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/467445.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pug模板引擎——jade

随着前端项目工程化的发展&#xff0c;代码结构越来越复杂&#xff0c;代码却越来越简单&#xff0c;为了将更多的精力集中在业务功能上面&#xff0c;对页面的快速构建需求日益剧增&#xff0c;同js、css一样&#xff0c;html也出现了各种各样的工具&#xff0c;即模板引擎&am…

广东,就是这么横?

昨晚的稿 今天发一下 应该有好久好久没有写篮球相关的文章了&#xff0c;因为之前写了被骂了&#xff0c;不过&#xff0c;今天不一样&#xff0c;毕竟方超巨打得这么好&#xff0c;不吹一下&#xff0c;总感觉今天不完整&#xff0c;骂就骂了吧&#xff0c;反正也不差这一次了…

在ASP.NET中利JavaScript实现控件的聚焦

在Windows应用程序中很容易控制控件的聚焦&#xff0c;但是在ASP.NET中并没有提供这样的功能&#xff0c;但是我们同样可以实现这样的功能&#xff0c;这篇文章就讲述了通过JaveScript实现在页面上某一特定控件获得焦点的功能。 下面是用到的JavaScript代码。 <script langu…

mysql自动备份发邮箱,定时任务自动备份数据库并邮件发送

我原本是使用Vastar的第一个脚本方案来自动备份WordPress数据库并邮件发送的&#xff0c;不过后来因为更换服务器&#xff0c;不知道为什么造成了会二次备份并有错误提示。刚好Vastar又给了一个更简洁的方法&#xff0c;于是昨天就替换掉了。不过Vastar的是同时备份数据库和网站…

电厂各类设备原理动图,绝对让你看花眼!

▲ 火力发电流程原理▲ 核能发电流程原理▲ 水力发电流程原理▲ 光热发电原理▲ 垃圾发电原理▲ 蒸汽吸收式制冷原理▲ 尿素热解脱硝流程原理▲ 湿法脱硫工艺原理▲ 钢球磨煤机内煤的破碎原理▲ 碎煤机工作原理▲ 螺旋输送机&#xff08;绞龙&#xff09;原理▲ 多管电除尘器▲…

也谈MMU管理机制

1&#xff0c;结构&#xff1a; MMU存储器系统的结构允许对存储器系统的精细控制。大部分的控制细节由存在存储器中的转换表提供。这些表的入口定义了从1KB 到1MB 的各种存储器区域的属性。这些属性包括&#xff1a; 虚拟地址到物理地址映射 ARM 处理器产生的地址叫虚拟…

__ATTRIBUTE__ 你知多少?

_ATTRIBUTE__ 你知多少&#xff1f; 1 #include "stdio.h"2 3 /* 地址参考基准 */4 5 char r1;6 short r2;int refer;7 8 struct p9 { 10 int a; 11 12 char b; 13 14 short c; 15 16 }__attribute__((aligned(4))) pp; 17 /* 4字节对齐&#xff0c;a…

oracle 根据分隔符提取,oracle自定义函数按照某个分隔符拆分字符串

1.首先需要定义一个集合类型&#xff0c;我这里定义的是变长数组类型(VARRAY)create type type_splitstr is varray(1024) of varchar2(128);--注意&#xff0c;我这里之所以不用嵌套表类型(NESTED TABLE)&#xff0c;是因为oracle官方文档有如下说明。--Nested Tables: The in…

跟几位大佬共进晚餐

这是一篇几个程序员大佬聚会的聚后感文章这次聚会比较唐突&#xff0c;连总从广州专门开车来深圳看望我们&#xff0c;我们约在了某个地铁站的八合里牛肉火锅店&#xff0c;这是一个周五的下午&#xff0c;理论上是非常简单的一个周五&#xff0c;但是因为这些男人女人的存在&a…

vue.js框架搭建

安装脚手架 前提条件&#xff1a;已安装node&#xff08;4.0版本以上&#xff09;&#xff0c;npm a、全局安装 vue-cli npm install -g vue-cli 安装成功后可以通过命令行查看版本号&#xff0c;如图 b、初始化项目 新建一个文件夹命名为01vue&#xff0c;准备在此文件夹下存放…

oracle数据库imp导入,imp 导入 没有数据库

IMP-00009: 导出文件异常结束今天准备从生产库向测试库进行数据导入&#xff0c;结果在imp导入的时候遇到“ IMP-00009:导出文件异常结束” 错误&#xff0c;google一下&#xff0c;发现可能有如下原因导致imp的数据太大&#xff0c;没有写buffer和commit两个数据库字符集不同从…

MIK C语言面试两题

这是一个读者朋友在知识星球上提到的两个笔试题&#xff0c;第一个题目比较简单&#xff0c;关键在第二个题目「编程题」&#xff0c;我文章中写的解题思路应该不是最好的&#xff0c;希望大神读者们给出更好的答案&#xff0c;让这个充满乐趣的程序世界再增添一些乐趣吧&#…

[听尉迟方侃侃]平台

很长一段时期我都不能理解什么叫做平台。这个平台那个平台&#xff0c;随随便便的东西都要带上“平台”两个字以期蓬荜生辉。搞得人很是反感。 查了一下金山词霸&#xff0c;对平台一词有两个解释和软件行业相关&#xff1a; 解释1、[platform] ∶ 通常高于附近区域的平…

Swift基础学习(二)数据类型

在编程语言中&#xff0c;不同的数据信息需要不同的数据类型来存储&#xff0c;计算机内存中针对不同的数据类型它们所分配的内存大小是不同的&#xff0c;特定的值需要特定的类型来声明。 Swift 数据类型 内置数据类型 整数 - Int & UInt 根据一个整数变量占据的内存空间&…

看看大疆的C语言面试题

惯例&#xff0c;这笔试题也是一个读者朋友发给我的&#xff0c;简单看了下&#xff0c;并不觉得这是一个非常困难的题目&#xff0c;最近是校招准备的时候&#xff0c;很多人给我说发面试题对大家有帮助。这个题目面试官强调了这个跑在64位系统下。代码如下:#define mal(x,y) …

php三级栏目调用,织梦当前栏目调用二级、三级栏目且栏目高亮解决方法

在处理企业站的时候&#xff0c;经常发现要调用二三级栏目栏目&#xff0c;且需要高亮显示&#xff0c;具体实现方法如下。1、打开 \include\taglib\channelartlist.lib.php 找到$tpsql " reid$typeid AND ispart<>2 AND ishidden<>1 ";改成if($typeson…

RocketMQ实战(一)

阿里巴巴有2大核心的分布式技术&#xff0c;一个是OceanBase&#xff0c;另一个就是RocketMQ。在实际项目中已经领教过RocketMQ的强大&#xff0c;本人计划写一个RocketMQ实战系列&#xff0c;将涵盖RocketMQ的简介&#xff0c;环境搭建&#xff0c;初步使用、API详解、架构分析…

C面试总结文档

最近很多人有参加面试&#xff0c;面试就避免不了笔试&#xff0c;嵌入式面试的话&#xff0c;避免不了C语言&#xff0c;所以给大家准备了两份pdf C语言面试总结的文档。在本公众号回复 「C面试」获取pdf下载链接推荐阅读&#xff1a;专辑|Linux文章汇总专辑|程序人生专辑|C语…

linux下根据端口查进程,linux根据进程查端口,根据端口查进程

[roottest_environment src]# netstat -tnllup 能显示对应端口和进程Active Internet connections (only servers)Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program nametcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/systemdtcp 0 0 0.0.0.0:6000 0.0.0.0:*…

程序员到底怎么了

我们是这样的一群人&#xff1a;每天都在“努力”的工作着&#xff0c;每天都和计算机打交道&#xff0c;泡在网上&#xff0c;打游戏&#xff0c;查资料&#xff0c;发微博。可是有一天&#xff0c;突然意识到&#xff0c;我们的未来在哪里&#xff0c;每个月那点可怜的工资&a…