当初是自己要装X,非要用c来写信息隐藏作业,装了X,就得付出实践。查了好久资料,到期末才把作业交了,这里总结一下。

这道题是将真彩图转换为灰度图

  • 关于BMP文件结构,这是困扰了我好久的问题,上网查了很久图片的知识才弄明白
  • BMP文件包括以下几部分(具体结构在程序中说明):
    • 位图文件头
    • 位图信息头
    • 调色板
    • 位图数据
  • 结构体内存对齐原则对于pragma pack(n)
    • 当成员大小小于n时,每个成员存储的起始位置要从该成员大小的整数倍开始,否则从n的整数倍开始
    • 成员是结构体时相对于起始偏移是以其内部最大成员为准
    • 当n大于内部最大成员时,结构体的总大小是其内部最大成员的整数倍反之为n的整数倍
    • 32位默认n为4,64位默认为8
  • 因此在定义头结构的时候要加上#pragma pack(1),设置以1字节为对齐方式,不然后面数据会错位
  1. /*
  2. 真彩图转换成灰度图的改进版
  3. (不把真彩图的每个像素点放入二维矩阵,而是读一行写一行)
  4. blog:http://www.cnblogs.com/wd1001/
  5. 2015年6月2日19:04:09
  6. */
  7. #include<stdio.h>
  8. #include<malloc.h>
  9. #include<stdlib.h>
  10. /*
  11. 位图头结构
  12. */
  13. #pragma pack(1)
  14. typedef struct tagBITMAPFILEHEADER
  15. {
  16. unsigned char bfType[];//文件格式
  17. unsigned long bfSize;//文件大小
  18. unsigned short bfReserved1;//保留
  19. unsigned short bfReserved2;
  20. unsigned long bfOffBits; //DIB数据在文件中的偏移量
  21. }fileHeader;
  22. #pragma pack()
  23. /*
  24. 位图数据信息结构
  25. */
  26. #pragma pack(1)
  27. typedef struct tagBITMAPINFOHEADER
  28. {
  29. unsigned long biSize;//该结构的大小
  30. long biWidth;//文件宽度
  31. long biHeight;//文件高度
  32. unsigned short biPlanes;//平面数
  33. unsigned short biBitCount;//颜色位数
  34. unsigned long biCompression;//压缩类型
  35. unsigned long biSizeImage;//DIB数据区大小
  36. long biXPixPerMeter;
  37. long biYPixPerMeter;
  38. unsigned long biClrUsed;//多少颜色索引表
  39. unsigned long biClrImporant;//多少重要颜色
  40. }fileInfo;
  41. #pragma pack()
  42. /*
  43. 调色板结构
  44. */
  45. #pragma pack(1)
  46. typedef struct tagRGBQUAD
  47. {
  48. unsigned char rgbBlue; //蓝色分量亮度
  49. unsigned char rgbGreen;//绿色分量亮度
  50. unsigned char rgbRed;//红色分量亮度
  51. unsigned char rgbReserved;
  52. }rgbq;
  53. #pragma pack()
  54.  
  55. int main()
  56. {
  57. /*存储RGB图像的一行像素点*/
  58. unsigned char ImgData[][];
  59. /*将灰度图的像素存到一个一维数组中*/
  60. unsigned char ImgData2[];
  61. int i,j,k;
  62. FILE * fpBMP,* fpGray;
  63. fileHeader * fh;
  64. fileInfo * fi;
  65. rgbq * fq;
  66.  
  67. if((fpBMP=fopen("G:/vc6.0/work/21.bmp","rb"))==NULL)
  68. {
  69. printf("打开文件失败");
  70. exit();
  71. }
  72.  
  73. if((fpGray=fopen("G:/vc6.0/work/22.bmp","wb"))==NULL)
  74. {
  75. printf("创建文件失败");
  76. exit();
  77. }
  78.  
  79. fh=(fileHeader *)malloc(sizeof(fileHeader));
  80. fi=(fileInfo *)malloc(sizeof(fileInfo));
  81. //读取位图头结构和信息头
  82. fread(fh,sizeof(fileHeader),,fpBMP);
  83. fread(fi,sizeof(fileInfo),,fpBMP);
  84. //修改头信息
  85. fi->biBitCount=;
  86. fi->biSizeImage=( (fi->biWidth*+)/ ) * *fi->biHeight;
  87. //fi->biClrUsed=256;
  88.  
  89. fh->bfOffBits = sizeof(fileHeader)+sizeof(fileInfo)+*sizeof(rgbq);
  90. fh->bfSize = fh->bfOffBits + fi->biSizeImage;
  91.  
  92. //创建调色版
  93. fq=(rgbq *)malloc(*sizeof(rgbq));
  94. for(i=;i<;i++)
  95. {
  96. fq[i].rgbBlue=fq[i].rgbGreen=fq[i].rgbRed=i;
  97. //fq[i].rgbReserved=0;
  98. }
  99. //将头信息写入
  100. fwrite(fh,sizeof(fileHeader),,fpGray);
  101. fwrite(fi,sizeof(fileInfo),,fpGray);
  102. fwrite(fq,sizeof(rgbq),,fpGray);
  103. //读取RGB图像素并转换为灰度值
  104. for ( i=;i<fi->biHeight;i++ )
  105. {
  106. for(j=;j<(fi->biWidth+)/*;j++)
  107. {
  108. for(k=;k<;k++)
  109. fread(&ImgData[j][k],,,fpBMP);
  110. }
  111. for(j=;j<(fi->biWidth+)/*;j++)
  112. {
  113. ImgData2[j]=int( (float)ImgData[j][] * 0.114 +
  114. (float)ImgData[j][] * 0.587 +
  115. (float)ImgData[j][] * 0.299 );
  116. }
  117. //将灰度图信息写入
  118. fwrite(ImgData2,j,,fpGray);
  119. }
  120.  
  121. free(fh);
  122. free(fi);
  123. free(fq);
  124. fclose(fpBMP);
  125. fclose(fpGray);
  126. printf("success\n");
  127. return ;
  128. }

结果:

c语言实现BMP图像转换为灰度图的更多相关文章

  1. 【Python开发】python PIL读取图像转换为灰度图及另存为其它格式(也可批量改格式)

    例如有一幅图,文件名为"a.jpg'.  读取: from PIL import Image #或直接import Image im = Image.open('a.jpg') 将图片转换成 ...

  2. 从视频文件中读入数据-->将数据转换为灰度图-->对图像做canny边缘检测-->将这三个结构显示在一个图像中

    //从视频文件中读入数据-->将数据转换为灰度图-->对图像做canny边缘检测-->将这三个结构显示在一个图像中 //作者:sandy //时间:2015-10-10 #inclu ...

  3. 机器学习进阶-图像基本处理-视频的读取与处理 1.cv2.VideoCapture(视频的载入) 2.vc.isOpened(载入的视频是否可以打开) 3.vc.read(视频中一张图片的读取) 4.cv2.cvtColor(将图片转换为灰度图)

    1.vc = cv2.VideoCapture('test.mp4') #进行视频的载入 2.vc.isOpened() # 判断载入的视频是否可以打开 3.ret, frame = vc.read( ...

  4. Android-将RGB彩色图转换为灰度图

    package com.example.yanlei.wifi; import android.graphics.Bitmap; import android.graphics.BitmapFacto ...

  5. Qt 中彩色图像转换为灰度图

    近期在做几个图像处理相关的项目.里面有一个操作就是须要先将彩色图像转换为灰度图像. QImage 有一个convertToFormat方法.最開始一直用这个函数来实现. 可是今天细致看了看,发现这个函 ...

  6. 如何使用 python3 将RGB 图片转换为 灰度图

    首先,介绍第一种方法, 使用  PIL  库,   PIL库是一种python语言常用的一个图形处理库. 关于   PIL  库的安装本文就不介绍了. from PIL import Image I ...

  7. Android 将ARGB图片转换为灰度图

    思路如下: 1.读取or照相,得到一张ARGB图片. 2.转化为bitmap类,并对其数据做如下操作: A通道保持不变,然后逐像素计算:X = 0.3×R+0.59×G+0.11×B,并使这个像素的值 ...

  8. C# (灰度)加权平均法将图片转换为灰度图

    private Bitmap ToG(string file) { using (Bitmap o = new Bitmap(file)) { Bitmap g = new Bitmap(o.Widt ...

  9. [Xcode 实际操作]六、媒体与动画-(2)使用图形上下文转换图片为灰度图

    目录:[Swift]Xcode实际操作 本文将演示如何将图片转换为灰度图. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import UIKit class V ...

随机推荐

  1. UVA253 Cube painting(数学)

    题目链接. 分析: 用的<训练指南>上的方法.详见P17. 从6个面中选一个做顶面,再从剩下的4个面中选1个做正面,则此正方体唯一确定. 需要枚举共6*4=24种. #include &l ...

  2. -_-#【Mac】快捷操作

    快捷键 command + 拖拽 = 剪切option + 拖拽 = 复制command + option + 拖拽 = 快捷方式 command + ] 前进command + [ 后退 comma ...

  3. 【转】浮点格式IEEE754详解

    原文网址:http://www.cnblogs.com/zjujunge/archive/2012/09/13/2682613.html Intel聘请了最好的数值分析家来为8087FPU设计浮点数格 ...

  4. c++ map 插入数据后,begin(),end()以及当前迭代器的变化

    1. map.end()指向map的最后一个元素之后的地址,无论执行map.erase(iter)还是map.add(key, value),map.end()所返回的值永远不会发生变化,都是指向同一 ...

  5. 链接器(linker)的作用——CSAPP第7章读书笔记

    首先说说我为什么要去读这一章.这个学期开OS的课,在Morden Operating System上读到和Process有关的内容时看到这样一句话:“Process is fundamentally ...

  6. WIndows系统下mysql-noinstall安装配置

    环境: Windowsmysql-noinstall-5.0.37-win32.zip 一.下载MySQL http://www.mysql.com/downloads 二.安装过程 1.解压缩mys ...

  7. iOS开发常用国外网站清单

    工欲善其事必先利其器,最近发现临时查找一些东西容易浪费时间,花了点时间整理一下常用的网站,方便以后备用. 国内的code4app,ui4app,cocoachina,oschina,csdn就不说了, ...

  8. [Falcor] Intro to JSON Graph

    JSON is a very commonly used data interchange format. Unfortunately while most application domain mo ...

  9. 关于BT下载的一点事儿

    之前一直对BT下载很的好奇,今天迅雷出现了一些问题,于是上网了解了一下BT下载的原理,果然还是有所收获的. 1.为什么BT下载用户越多下载,速度越快? 答:BT全名为BitTorrent. 在传统下载 ...

  10. Java 编程的动态性 第1 部分: 类和类装入--转载

    原文地址:http://www.ibm.com/developerworks/cn/java/j-dyn0429/ 本文是这个新系列文章的第一篇,该系列文章将讨论我称之为 Java 编程的动态性的一系 ...