博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
linu下C语言之BMP图片操作编程(下)
阅读量:6432 次
发布时间:2019-06-23

本文共 2880 字,大约阅读时间需要 9 分钟。

前面提高了一个将BMP左转的程序,右转其实也是类似的操作,就不写了,这节,我们来实现,将一张BMP图进行灰度处理,代码贴上:

#include 
#include
#include
#define RGB(r,g,b) ((r+g+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){ if(argc != 4) return -1 ; int fd ; int dest_fd ; fd = open(argv[1] , O_RDONLY); if(-1 == fd) { perror("open bmp file fail"); return -2 ; } dest_fd = open( argv[2] , O_RDWR | O_CREAT|O_TRUNC , 0777); if(dest_fd < 0 ) { perror("open rgb565 fail"); return -3 ; } int value = atoi(argv[3]); struct bmp_header header ; int ret ; ret = read(fd , &header , sizeof(struct bmp_header)); 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); //改变地方 write(dest_fd , &header , sizeof(struct bmp_header)); int row , col ; char *p = NULL ; for(row = 0 ; row < 10 ; row++) { for(col = 0 ; col < 10 ; col++) { p = buffer + (row * 800 + col)*3 ; *p = 255; *(p+1)=255; *(p+2)=255; } } char data ; for(row = 0 ; row < 480 ; row++) { for(col = 0 ; col < 800 ; col++) { p =( buffer+(row*800 + col)*3); data = RGB((unsigned char)(*(p+2)) , (unsigned char)(*(p+1)) , (unsigned char )(*(p))); if(data < value) { *p = 0; *(p+1)=0; *(p+2)=0; } else { *p = data; *(p+1)=data; *(p+2)=data; } write(dest_fd , p , 3); } } close(dest_fd); return 0 ; }

转载地址:http://zxaga.baihongyu.com/

你可能感兴趣的文章
2017(中国)商博会系列介绍之智能生活展
查看>>
eclipse link方式安装 sts(Spring Tool Suite)
查看>>
数据结构思维 第三章 `ArrayList`
查看>>
CentOS6、7编译安装FFmpeg
查看>>
被眼睛欺骗?这正是你比机器高明的地方!深度学习如何处理认知错觉
查看>>
向导机器人出没日本机场,外表萌萌哒!
查看>>
Android项目实战(二十九):酒店预定日期选择
查看>>
PHP IDE phpstorm 常用快捷键
查看>>
蓝牙的未来怎样发展?
查看>>
AI、新材料、5G、智慧城市,未来的社会场景在高交会提前上演
查看>>
Facebook开发的一种数据查询语言——GraphQL:安全概述和测试技巧
查看>>
ECS主动运维2.0,体验升级,事半功倍
查看>>
vim 学习方法
查看>>
php token验证范例
查看>>
WebSocket的C++服务器端实现
查看>>
java中两种添加监听器的策略
查看>>
MySQL explain 详解
查看>>
【翻译】Traits in PHP
查看>>
脑洞成现实!AI系统可提前10s预测地震
查看>>
视频风口下,传统CDN服务商将归何处
查看>>