將24位BMP真彩圖轉換成BMP灰度圖
轉自:http://blog.csdn.net/xiakq/article/details/2956902
真正的24位真彩圖與8位的灰度圖的區別就在於,真彩圖檔案中沒有調色盤,灰度圖有調色盤,真彩圖中的象素矩陣是RGB值,灰度圖中的象素矩陣是調色盤索引值。
我在這裡用C語言只簡單的改變象素矩陣的RGB值,來達到彩色圖轉變為灰度圖,並沒有新增調色盤。
主要步驟: 選擇演算法把R,G,B三原色轉換成灰度顏色。
演算法選取:
(1)平均值演算法:
顧名思意,就是取某點R、G、B三原色的平均值作為該點轉換之後的灰度顏色,可用公式表示如下:
R=G=B=(R+G+B)/3
(2)快速演算法:
由於平均值演算法的公式當中有除3的步驟,所以如果用在遊戲中的話實時效果一定會大打折扣,所以有必要將其改造一下,首先想到的是用移位來代替除法,我們使用/4(也就是>>2)來實現。但是/3和/4之間的誤差太大,有必要將其公式改造一下,設改造後的公式為(R+G+B+a)>>2,解出a的值是(R+G+B)/3,我們暫時取a為128(0~255的中間值)。公式如下:
R=G=B=(R+G+B+128)/4>>2
(3).加權平均值演算法:
根據光的亮度特性,其實正確的灰度公式應當是R=G=B=R*0.299+G*0.587+B0.144,為了提高速度我們做一個完全可以接受的近似,公式變形如下:
R=G=B=(R*3+G*6+B)/10
(4).精確加權平均值演算法:
如果你的程式不是用於遊戲,而只是想得到灰度圖,那麼就老老實實的使用帶浮點數的公式吧:
R=G=B=R*0.299+G*0.587+B0.144
原始碼:
#include <stdio.h>
#include <windows.h>
int main()
{
BITMAPFILEHEADER bmpfileheader; //檔案頭
BITMAPINFOHEADER bmpinfoheader; //資訊頭
BYTE *matrix1; //象素矩陣
FILE *fp; //讀取操作流
FILE *store; //讀出操作流
fp=fopen("picture.bmp","r+b");
if (fp == NULL)
{
printf("Open failed/n");
return 1;
}
else
printf("Open Successsfully/n");
fread(&bmpfileheader,sizeof(BITMAPFILEHEADER),1,fp);//讀取檔案頭
fread(&bmpinfoheader,sizeof(BITMAPINFOHEADER),1,fp);//讀取資訊頭
if (bmpinfoheader.biBitCount != 24)
{
printf("The error picture!");
return 1;
}
matrix1 = new BYTE[bmpinfoheader.biSizeImage];
memset(matrix1,0,bmpinfoheader.biSizeImage);
fread(matrix1,1,bmpinfoheader.biSizeImage,fp);//讀取象素矩陣
fclose(fp);
for(unsigned long k=0;k<bmpinfoheader.biSizeImage;k=k+3)
{
*(matrix1+k)=*(matrix1+k+1)=*(matrix1+k+2)=(*(matrix1+k)+*(matrix1+k+1)+*(matrix1+k+2))/3;
}
//建立新的灰度圖
store=fopen("test.bmp","w+b");
fwrite(&bmpfileheader,sizeof(BITMAPFILEHEADER),1,store);
fwrite(&bmpinfoheader,sizeof(BITMAPINFOHEADER),1,store);
fwrite(matrix1,1,bmpinfoheader.biSizeImage,store);
fclose(store);
int a;
scanf("%d",&a);
return 0;
}
相關文章
- 如何將真彩色圖轉換為各種灰度圖
- 將bmp檔案轉換成JPEG(待修改,目前可轉換但圖片倒轉)
- 怎麼將bmp格式圖片轉換jpg格式的
- C++圖片格式轉換:BMP轉JPEGC++
- 將任意bmp圖片大小重新設定後生成新的bmp圖片
- ppm轉換bmp
- 【LaTeX入門】08、將png、bmp、jpg轉換成eps
- 利用 Adobe Reader 的API將 PDF 轉換成 BMPAPI
- BMP點陣圖格式詳解--轉載
- Bmp讀寫二值圖
- 24位真彩色轉換為8位灰度圖片(完整程式碼)
- 系統IO讀BMP圖片
- bmp是什麼格式的檔案 怎麼把jpg轉換為bmp
- BMP點陣圖檔案結構及VC操作 (轉)
- BMP點陣圖檔案結構及平滑縮放 (轉)
- 如何將圖片轉換成影片?
- PHP 把原始檔加密到 BMP 點陣圖PHP加密
- jpeg,png,bmp轉換成icon,windows本地匯出icon檔案Windows
- 在VC中自建操作BMP點陣圖檔案的類 (轉)
- BMP檔案結構 (轉)
- bmp to jpg(32位bmp也可處理)
- BMP圖片的複製#顯示到螢幕
- 將彩色圖轉化為灰度圖及其原理介紹
- C語言實現BMP圖片的放大縮小C語言
- 將圖象列表轉換成裝置無關點陣圖 (轉)
- 如何將heic格式轉換成jpg圖片?
- python將矩陣轉化為灰度圖Python矩陣
- 圖片格式轉換,JPG圖片轉換成PDF
- 怎麼將pdf轉換成jpg圖片格式
- 將Excel表格內容直接轉換成圖片Excel
- 將bmp檔案壓縮為jpg檔案
- BMP格式圖片縮放及在LCD螢幕展示練習
- BMP檔案結構
- BMP檔案詳解
- 瞧瞧這個將CBitmap寫到Bmp檔案裡的函式 (轉)函式
- 圖片怎麼轉換成PDF,圖片轉PDF教程
- 關於Opengl中將24位BMP圖片加入一個alpha通道並實現透明的問題
- 如何將圖片轉word?圖文轉換選轉易俠