最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言實現(xiàn)將彩色bmp圖像轉(zhuǎn)化為灰圖、灰度圖像反色

 更新時間:2021年10月25日 17:06:59   作者:混z  
這篇文章主要為大家詳細介紹了C語言實現(xiàn)將彩色bmp圖像轉(zhuǎn)化為灰圖、灰度圖像反色,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了C語言實現(xiàn)將彩色bmp圖像轉(zhuǎn)化為灰圖、灰度圖像反色的具體代碼,供大家參考,具體內(nèi)容如下

彩色圖像轉(zhuǎn)灰度圖像

彩色(24位)bmp圖像結(jié)構(gòu):

typedef struct{
 bitmapFileHeader bfHeader;
 bitmapInfoHeader biHeader;
 unsigned char *imgData;
}bmp;

灰度(8位)bmp圖像結(jié)構(gòu):

typedef struct{
 bitmapFileHeader bfHeader;
 bitmapInfoHeader biHeader;
 rgbQUAD palette[256];
 unsigned char *imgData;
}bmp;

bmp灰度圖像比彩色圖像多了一個調(diào)色板,調(diào)色板中每個元素的類型是一個RGBQUAD結(jié)構(gòu),占四個字節(jié),其定義如下:

typedef struct{
 unsigned char rgbBlue;
 unsigned char rgbGreen;
 unsigned char rgbRed;
 unsigned char rgbReserved;

}rgbQUAD;

在實際的bmp圖像中調(diào)色板:

代碼實現(xiàn)將彩色bmp圖像轉(zhuǎn)化位灰值圖像:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#pragma pack(1)   //全緊湊模式

typedef struct {
 unsigned char bfType[2];
 unsigned int bfSize;
 unsigned short bfReserved1;
 unsigned short bfReserved2;
 unsigned int bfOffBits;
}bitmapFileHeader;

typedef struct {
 unsigned int biSize;
 unsigned int biWidth;
 unsigned int biHeight;
 unsigned short biPlanes;
 unsigned short biBitCount;
 unsigned int biCompression;
 unsigned int biSizeImage;
 unsigned int biXPixPerMeter;
 unsigned int biYPixPerMeter;
 unsigned int biClrUsed;
 unsigned int biClrImportant;
}bitmapInfoHeader;


typedef struct{
 unsigned char rgbBlue;
 unsigned char rgbGreen;
 unsigned char rgbRed;
 unsigned char rgbReserved;

}rgbQUAD;

typedef struct{
 bitmapFileHeader bfHeader;
 bitmapInfoHeader biHeader;
 rgbQUAD palette[256];
 unsigned char *imgData;
}bmp;

int main(){
 FILE *fp;
 if((fp=fopen("d:\Temp\\test.bmp","rb"))==NULL){
  perror("can not open file!");
  return -1;
 }
 //讀入彩色bmp圖像文件頭,信息頭和圖像數(shù)據(jù)
 bitmapFileHeader bfHeader;
 fread(&bfHeader,14,1,fp);
 bitmapInfoHeader biHeader;
 fread(&biHeader,40,1,fp);
 int imSize=biHeader.biSizeImage;
 int width=biHeader.biWidth;
 int height=biHeader.biHeight;
 int bitCount=biHeader.biBitCount;
 int lineBytes=(width*bitCount+31)/32*4;
 
 fseek(fp,bfHeader.bfOffBits,SEEK_SET);
 unsigned char*imageData=(unsigned char*)malloc(imSize*sizeof(unsigned char));
 fread(imageData,imSize*sizeof(unsigned char),1,fp); 
 fclose(fp);

 bmp b;
 int i,j,k;
 memcpy(&(b.bfHeader),&bfHeader,sizeof(bfHeader));
 memcpy(&(b.biHeader),&biHeader,sizeof(biHeader));
 b.bfHeader.bfOffBits=1078;  //因新增了調(diào)色板,需調(diào)整圖像數(shù)據(jù)偏移位置
 b.biHeader.biBitCount=8;  //改變圖像位數(shù)
 int lineBytes_new=(width*8+31)/32*4; //重新計算每行數(shù)據(jù)字節(jié)
 b.biHeader.biSizeImage=lineBytes_new*height; //改變圖像數(shù)據(jù)大小
 b.bfHeader.bfSize=1078+b.biHeader.biSizeImage; //改變文件數(shù)據(jù)大小
 b.imgData=(unsigned char*)malloc(sizeof(unsigned char)*b.biHeader.biSizeImage);
 memset(b.imgData,0,sizeof(unsigned char)*b.biHeader.biSizeImage);
 for(i=0;i<256;i++){
  b.palette[i].rgbBlue=i;
  b.palette[i].rgbGreen=i;
  b.palette[i].rgbRed=i;
 }
 
 for(i=0;i<height;i++){
  for(j=0;j<width;j++){
   //將每一個像素都按公式y(tǒng)=B*0.299+G*0.587+R*0.114進行轉(zhuǎn)化
   b.imgData[lineBytes_new*i+j]=imageData[lineBytes*i+j*3]*0.299+imageData[lineBytes*i+j*3+1]*0.587+imageData[lineBytes*i+j*3+2]*0.114;
  }
 }

 char savePath[]="D:\Temp\\save_test.bmp";
 FILE *f=fopen(savePath,"wb");
 if(f==NULL){
  perror("can not open file!");
  return -2;
 }
 fwrite(&b.bfHeader,sizeof(bitmapFileHeader),1,f);
 fwrite(&b.biHeader,sizeof(bitmapInfoHeader),1,f);
 fwrite(&b.palette,1024,1,f);
 fwrite(b.imgData,sizeof(unsigned char)*b.biHeader.biSizeImage,1,f);
 fclose(f);
 
 free(imageData);
 free(b.imgData);
 return 0;
}

代碼效果:

灰度圖像反色

int i,j;
 for(i=0;i<height;i++){
  for(j=0;j<width;j++){
   b.imgData[lineBytes*i+j]=255-imageData[lineBytes*i+j];
  }
 }

代碼效果:

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C++深入講解namespace與string關(guān)鍵字的使用

    C++深入講解namespace與string關(guān)鍵字的使用

    namespace命名空間或者叫名字空間,傳統(tǒng)的c++只有一個全局的namespace,namespace引入了復(fù)雜性。namespace允許像類,對象,函數(shù)聚集在一個名字下。本質(zhì)上講namespace是對全局作用域的細分
    2022-05-05
  • 關(guān)于C++動態(tài)分配內(nèi)存的介紹

    關(guān)于C++動態(tài)分配內(nèi)存的介紹

    今天小編就為大家分享一篇關(guān)于關(guān)于C++動態(tài)分配內(nèi)存的介紹,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • C++中this指針用法詳解及實例

    C++中this指針用法詳解及實例

    這篇文章主要介紹了C++中this指針用法詳解及實例的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • 解析ActiveMQ的使用說明總結(jié)

    解析ActiveMQ的使用說明總結(jié)

    本篇文章是對ActiveMQ的使用進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • 一篇文章徹底搞懂C++常見容器

    一篇文章徹底搞懂C++常見容器

    容器就是一些特定類型對象的集合,容器可以分為順序容器和關(guān)聯(lián)容器,下面這篇文章主要給大家介紹了關(guān)于C++常見容器的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-02-02
  • OpenCV圖像處理之常見的圖像灰度變換

    OpenCV圖像處理之常見的圖像灰度變換

    這篇文章主要介紹了OpenCV圖像處理之常見的圖像灰度變換,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • 在C語言中使用對數(shù)函數(shù)的方法

    在C語言中使用對數(shù)函數(shù)的方法

    這篇文章主要介紹了在C語言中使用對數(shù)函數(shù)的方法,包括以e為底和以10為底的對數(shù)計算,需要的朋友可以參考下
    2015-08-08
  • C++中發(fā)送HTTP請求的實現(xiàn)方式

    C++中發(fā)送HTTP請求的實現(xiàn)方式

    使用C++編程發(fā)送HTTP請求通常需要使用第三方的HTTP庫或框架,在C++中,有幾個受歡迎的HTTP庫可供選擇,例如Curl、Boost.Beast和cpp-httplib,另外,也可以自己實現(xiàn)socket來發(fā)送http請求,需要的朋友可以參考下
    2024-04-04
  • opencv圖片的任意角度旋轉(zhuǎn)實現(xiàn)示例

    opencv圖片的任意角度旋轉(zhuǎn)實現(xiàn)示例

    這篇博客將介紹如何使用OpenCV旋轉(zhuǎn)圖像任意角度,實現(xiàn)各個角度的旋轉(zhuǎn),具有一定的參考價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-06-06
  • Qt自定義控件實現(xiàn)簡易儀表盤

    Qt自定義控件實現(xiàn)簡易儀表盤

    這篇文章主要為大家詳細介紹了Qt自定義控件實現(xiàn)簡易儀表盤,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12

最新評論

日土县| 拉孜县| 仪征市| 华亭县| 县级市| 大冶市| 泾源县| 会宁县| 荆州市| 茌平县| 凭祥市| 合肥市| 浪卡子县| 霍林郭勒市| 峨边| 武冈市| 台安县| 高要市| 临潭县| 宝坻区| 红安县| 洪雅县| 当阳市| 涟水县| 龙海市| 信宜市| 宁化县| 大渡口区| 韶山市| 台中市| 灵山县| 磐安县| 叙永县| 武功县| 房产| 东方市| 绥芬河市| 贵德县| 西昌市| 陆丰市| 凌源市|