//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;

}

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

  1. java ocr识别中文_java零碎要点—Tesseract 3.0,Java OCR 图像智能字符识别技术,可识别中文 | 学步园...

    2.Java OCR 图像智能字符识别技术,可识别中文 几天一直在研究OCR技术,据我了解的情况,国内最专业的OCR软件只有2家,清华TH-OCR和汉王OCR,看了很多的OCR 技术发现好多对英文与数 ...

  2. matlab误码率计算函数,matlab通信系统性能估计(误码率、误比特率、眼图、星座图….) | 学步园...

    biterr函数 biterr函数用来计算错误比特的个数和误比特率,其调用格式为: [number,ratio] = biterr(x,y) [number,ratio] = biterr(x,y,k ...

  3. java swing 嵌入地图_Java学习笔记之SWING — 基本SWING程序(实现外部地图文件导入并显示) | 学步园...

    前言:不好意思啊,昨天去柯桥了趟,基本没怎么碰电脑, 不过脑子里还是想这点这个地图编辑器的问题的,开始一直在想怎么解决外部文件读入导致换行符的混入,后来发现BufferedReader类的readLi ...

  4. java 设置组件所有字体_一次性设定Java程序所有组件字体及主题对字体的影响 | 学步园...

    转自:http://blog.csdn.net/LoveVV99/archive/2005/10/20/510241.aspx 用Java写程序时,希望能够设置各个控件的字体,一个个地设定各个控件的字 ...

  5. 基于matlab 求多边费马点,POJ2420(求多边形费马点) | 学步园

    题意:题目的意思就是给你N个点,在平面上寻找一个点,使得这个点到其他点的距离之和最小,问你最小的距离是多 少? 分析:在三角形内部这个点叫做费马点(费马点定义).那么这道题目就是求一个多变形的费马点. ...

  6. 图像haar特征提取 c语言,基于C语言的特征点提取程序 本程序是利用C语言对各种信号数据的特征点提取程序 - 下载 - 搜珍网...

    基于C语言的特征点提取程序\修改后 特征点提取程序\提取特征点\Debug\football.ilk 基于C语言的特征点提取程序\修改后 特征点提取程序\提取特征点\Debug\football.ob ...

  7. HALCON示例程序rim.hdev轮圈孔检测提取字符

    小哥哥小姐姐觉得有用点个赞呗! HALCON示例程序rim.hdev轮圈孔检测提取字符 示例程序源码(加注释) 关于显示类函数解释 dev_update_off () dev_close_window ...

  8. MATLAB图像取点操作

    %% 图像取点操作 % 读入图片 y=imread('数据.bmp'); imshow(y)%显示该图  set(gcf,'outerposition',get(0,'screensize'));%使 ...

  9. fcm脑图像分割matlab,MATLAB程序:用FCM分割脑图像

    MATLAB程序:用FCM分割脑图像 1. MATLAB程序 FCM_image_main.m function [accuracy,iter_FCM,run_time]=FCM_image_main ...

最新文章

  1. 独家 | Deepnote测评:数据科学家的新IDE
  2. Eclipse引入spring约束详细教程
  3. java启动 守护进程_java守护进程启动和关闭脚本
  4. c_str()和strcasecmp
  5. Vim 中文件目录浏览插件——NERD tree
  6. 微软公布 Windows Phone 8 多项新特性
  7. java new expression,JAVA公式解析示例
  8. android lru进程队列,Android缓存机制——LruCache
  9. python列表、元组、集合、字典、json相互转换以及其他基础入门
  10. [转]一个程序员的哲学思考(关于编程、关于人生)
  11. 面对 MySQL 查询索引失效,程序员的六大优化技巧!
  12. 拓端tecdat|R语言rjags使用随机效应进行臭氧数据分析
  13. JavaScript函数传参原理详解——值传递还是引用传递
  14. turicreate 视频_iOS 推出的turiCreate功能(一) 图片识别
  15. 1024@程序员:图灵社区福利来了,请本人签收
  16. QT程序退出后托盘图标不消失问题
  17. python居中对齐_python – PyQt5:居中对齐标签
  18. java组织树级结构
  19. 如何减轻tomcat压力_6种简单的技巧可帮助您减轻工作压力
  20. WPF-隐藏窗体标题栏和边框

热门文章

  1. ADO.NET- 基础总结及实例
  2. 6-14 数据库高级
  3. Lync Server 2010的部署系列_第六章 安装配置拓扑生成器、前端Server、前端池
  4. POJ 2976 Dropping Tests
  5. 学教育成空中楼阁 巨额学费背后却是失业风险
  6. python argparse nargs_Python | 使用argparse解析命令行参数
  7. Python 第三方模块之 pdfkit
  8. 关于Python3.7和Python3.6中元组类型数据内存存储问题
  9. C++类构造函数初始化列表及初始化成员变量的误区
  10. jdbc mysql demo_JDBC_demo:java连接mysql过程