linu下C语言之BMP图片操作编程(下)
前面提高了一个将BMP左转的程序,右转其实也是类似的操作,就不写了,这节,我们来实现,将一张BMP图进行灰度处理,代码贴上:
#include <stdio.h> #include <fcntl.h> #include <unistd.h> #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 ; }
linu下C语言之BMP图片操作编程(下)的更多相关文章
- linu下C语言之BMP图片操作编程(上)
BMP文件格式,也被称为位图图像文件或与设备无关的位图文件格式(DIB)或者只是一个位图,是 一个光栅图形 图像文件格式使用 来存储位图,数字,图片,独立的显示设备. 微软已经定义了一个特定的表示颜色 ...
- linu下C语言之BMP图片操作编程(中)
http://blog.csdn.net/morixinguan/article/details/50719472 关于BMP图的介绍之前已经说过了,最近要用到,又要重新开始学习. 现在实现一个让bm ...
- 【C】用C语言提取bmp图片像素,并进行K-means聚类分析——容易遇到的问题
关于bmp图片的格式,网上有很多文章,具体可以参考百度百科,也有例子程序.这里只提要注意的问题. (1)结构体定义问题:首先按照百度百科介绍的定义了结构体,但是编译发现重定义BITMAPFILEHEA ...
- C语言实现BMP图片生成
## #include <stdio.h> #include <stdlib.h> #include <string.h> typedef unsigned cha ...
- Go语言基础之接口(面向对象编程下)
1 接口 1.1 接口介绍 接口(interface)是Go语言中核心部分,Go语言提供面向接口编程,那么接口是什么? 现实生活中,有许多接口的例子,比如说电子设备上的充电接口,这个充电接口能干什么, ...
- .NET Core 图片操作在 Linux/Docker 下的坑
一.前言 .NET Core 目前更新到2.2了,但是直到现在在 .NET Core 本身依然不包括和图片有关的 Image.Bitmap 等类型.对于图片的操作在我们开发中很常见,比如:生成验证码. ...
- 位图文件格式及linux下C语言来操作位图文件
说到图片,位图(Bitmap)当然是最简单的,它是Windows显示图片的基本格式,其文件扩展名为*.BMP.由于没有经过任何的压缩,故BMP图片往往很大.在Windows下,任何格式的图片文件都要转 ...
- 嵌入式linux------SDL移植(am335x下显示bmp图片)
#include<stdio.h> #include "/usr/local/ffmpeg_arm/include/SDL/SDL.h" char *bmp_name[ ...
- bmp图片的有关操作
读取bmp图片 并生成新的bmp图片 #include "stdafx.h"#include <windows.h>#include <cmath>#inc ...
随机推荐
- bzoj 1880: [Sdoi2009]Elaxia的路线
Description 最近,Elaxia和w的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间.Elaxia和w每天都要奔波于宿舍和实验室之间,他们 希 ...
- 【USACO15FEB】审查(黄金)Censoring (Gold)
题目描述 Farmer John has purchased a subscription to Good Hooveskeeping magazine for his cows, so they h ...
- bzoj3963[WF2011]MachineWorks cdq分治+斜率优化dp
3963: [WF2011]MachineWorks Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 270 Solved: 80[Submit][S ...
- 【集训第三天·疯狂训练】哦,顺带学习了manacher
虽然说是疯狂训练吧,但是也没写多少题,就把伸展树的操作熟悉了一下,ac了5个题目. 一整天没啥可吐槽的,除了昨天在机房打游戏的某位朋友翻车后和教练谈了谈心2333 说题吧.. 1.BZOJ1208 H ...
- mouseover,mouseout和mouseenter,mouseleave的区别及适用情况
在做类似于百度地图右下角,不同地图切换UI时,遇到了问题. 就是鼠标滑过的时候出现一个层,当鼠标滑到当前层的话mouseover和mouseout在低版本的浏览器会出现闪动的现象,最简单的那就是把mo ...
- jquery easyui datagrid改变某行的值
$("#DeterminateMembers").datagrid("updateRow",{index:index,row:{fzr:"0" ...
- thymeleaf:局部变量 th:with
当th:with被处理,firstPer变量创建一个局部变量和变量添加到map自上下文,以便它是用于评估和其他上下文中声明的变量从开始,但只有包含< div >标记的范围内. <di ...
- 安装插件出现eclipse An internal error occurred during: "Installing Software". xxxxxxxxx
就是你自己本来就有那个插件了 百度怎么删吧.... 看一下我这个文章 强烈建议本地安装的时候用第四种安装 http://www.cnblogs.com/ydymz/articles/7203260.h ...
- C++ 实现俄罗斯方块
C++ 实现俄罗斯方块 一.实验介绍 1.1 实验内容 本节实验我们进行设计俄罗斯方块前的思路分析,以及介绍ncurses 库的使用方法. 1.2 实验知识点 C++ 编程基础 ncurses 库的使 ...
- MFC回车事件
这是一个使用MFC开发关于设备控制的windows应用程序 通过该项目我学到的内容: 继承的好处 应用程序的界面是与应用程序的代码有一定的对应关系的,界面中不同的控件对应不同的类,首先就是需要一个对话 ...