㈠ 如何利用c語言實現像素圖形的輸出
1、可以變成灰度圖也可以不變。這里假設你的圖像都是IPL_DEPTH_8U類型。
2、如果變成灰度圖,就是單通道圖像,獲取的就是每一個像素點的灰度值。
IplImage* img = cvLoadImage("test.bmp", 0);
for (int i = 0; i < img->height; i++)
{
for (int j = 0; j < img->width; j++)
{
//方法一:使用cvGet2D()函數間接訪問
CvScalar s = cvGet2D(img, i, j); //其中i代表y軸(第i行),即height;j代表x軸(第j列),即width。
printf("gray value=%f\n",s.val[0]);
//方法二:使用直接訪問
uchar val = ((uchar *)(img->imageData + i*img->widthStep))[j]; //i和j的意義同上
printf("gray value=%d\n",val);
}
}
3、如果不變成灰度圖,就是3通道圖像,獲取的就是每一個像素點的BGR值,然後分別獲取B值,G值和R值。
IplImage* img = cvLoadImage("test.bmp", 1);
for (int i = 0; i < img->height; i++)
{
for (int j = 0; j < img->width; j++)
{
//方法一:使用cvGet2D()函數間接訪問
CvScalar s=cvGet2D(img,i,j); //其中i代表y軸(第i行),即height;j代表x軸(第j列),即width。
printf("B=%f, G=%f, R=%f\n",s.val[0],s.val[1],s.val[2]); //注意是BGR順序
//方法二:使用直接訪問
int bVal = ((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels + 0]; // B
int gVal = ((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels + 1]; // G
int rVal = ((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels + 2]; // R
printf("B=%d, G=%d, R=%d\n",bVal,gVal,rVal); //注意是BGR順序
}
}
㈡ 我想用c語言將一個黑白bmp圖像的像素值存入一個數組中該怎麼做求各位大神幫忙啊~~
先解析bmp圖像的格式, windows 下面有 API和bmp頭結構,bmp頭貌似有3個部分, 算出像素數據的偏移量。然後二進制讀文件,保存到數組即可。
㈢ 用C語言實現低像素化,模擬光幻視圓點。怎樣把演算法變為代碼呢這個過程很不懂。有學習的網站嗎
其實就是壓縮演算法的一種吧。建議你用vc或matlab處理,參考計算機圖形學的知識,而且這個要有一定的高數基礎才好理解,c語言不好實現,載入圖像都要寫半天了。
代碼到pudn,Googlecode,sourceforge下載。
參考winGDI的內容,有處理介面
㈣ 如何用C語言(C++)讀取點陣圖的像素點RGB信息
pData裡面保存的就是一個一個的COLORREF結構,你只需要通過BITMAPINFOHEADER中的寬高等信息,計算位移,就可以讀取某個點的RGB值了。
還有一個簡單的辦法,你之前已經有memBitmap這個CBitmap了,通過這個做更方便。通過SelectObject將memBitmap放到一個CDC中,直接使用函數GetPixel函數就可以獲取指定某個點的RGB值了,這個不需要計算和位移。
㈤ c語言數字圖像處理怎麼顯示一張照片的像素值
#include <stdio.h>
#include <windows.h>
int main()
{
//變數
char title[255];//用於存放控制台窗口標題
HWND hwnd;//窗口的句柄,H:Handle
HDC hdc, hmemdc;//設備上下文句柄,DC:driver context
HBITMAP hbm;//圖片的句柄
BITMAP bm;//圖片結構體
RECT rect;//矩形 rectangle
//把控制台窗口調成100字元寬度,40行
system("mode con cols=100 lines=40");
//1.取得窗口的句柄
GetConsoleTitleA(title, 255);//獲取控制台窗口的標題
hwnd = FindWindowA(NULL, title);//通過窗口標題取得該窗口的句柄
//獲取窗口的高度和寬度
GetWindowRect(hwnd, &rect);
//2. 獲取畫筆
hdc = GetDC(hwnd);
/* if(!hdc)
printf("No val\n");
else
printf("have\n");
TextOutA(hdc, 300, 400, "Hello world", strlen("Hello world"));*/
hmemdc = CreateCompatibleDC(hdc);//創建一個兼容的DC
//3.載入圖片
hbm = (HBITMAP)LoadImageA(NULL, "123.bmp", IMAGE_BITMAP, 0, 0,
LR_LOADFROMFILE);
GetObject(hbm, sizeof(BITMAP), &bm);//得到圖片信息
//4.把圖片放入兼容DC中
SelectObject(hmemdc, hbm);
//5.在窗口上畫出圖片
BitBlt(hdc, 0, 0, bm.bmWidth, bm.bmHeight, hmemdc, 0, 0, SRCCOPY);
DeleteObject(hbm);
DeleteObject(hmemdc);
ReleaseDC(hwnd, hdc);
return 0;
}
㈥ 用c語言怎樣實現像素的復制
一般要畫滑鼠用一個8*16的像素位置,你可以自己先定義好數組,然後步驟如下:while(1){如果不是第一次繪制滑鼠,則用已保存的圖像覆蓋曾經滑鼠位置.bios中斷獲取滑鼠位置,如果滑鼠發生移動(和以前的位置不一樣),保存此位置下8*16的圖像,保存滑鼠位置,繪制滑鼠.如果發生CLK事件,則跳出循環,處理你的程序.}
㈦ 如何用c語言printf輸出bmp圖片的像素信息。
#include<math.h>
#include<iomanip.h>
#include<stdlib.h>
#include<windows.h>
#include<stdio.h>
#include<stdlib.h>
#include<iostream.h>
#include<fstream.h>
//---------------------------------------------------------------------------------------
//以下該模塊是完成BMP圖像(彩色圖像是24bitRGB各8bit)的像素獲取,並存在文件名為xiang_su_.txt中
unsignedchar*pBmpBuf;//讀入圖像數據的指針
intbmpWidth;//圖像的寬
intbmpHeight;//圖像的高
RGBQUAD*pColorTable;//顏色表指針
intbiBitCount;//圖像類型,每像素位數
//-------------------------------------------------------------------------------------------
//讀圖像的點陣圖數據、寬、高、顏色表及每像素位數等數據進內存,存放在相應的全局變數中
boolreadBmp(char*bmpName)
{
FILE*fp=fopen(bmpName,"rb");//二進制讀方式打開指定的圖像文件
if(fp==0)
return0;
//跳過點陣圖文件頭結構BITMAPFILEHEADER
fseek(fp,sizeof(BITMAPFILEHEADER),0);
//定義點陣圖信息頭結構變數,讀取點陣圖信息頭進內存,存放在變數head中
BITMAPINFOHEADERhead;
fread(&head,sizeof(BITMAPINFOHEADER),1,fp);//獲取圖像寬、高、每像素所佔位數等信息
bmpWidth=head.biWidth;
bmpHeight=head.biHeight;
biBitCount=head.biBitCount;//定義變數,計算圖像每行像素所佔的位元組數(必須是4的倍數)
intlineByte=(bmpWidth*biBitCount/8+3)/4*4;//灰度圖像有顏色表,且顏色表表項為256
if(biBitCount==8)
{
//申請顏色表所需要的空間,讀顏色表進內存
pColorTable=newRGBQUAD[256];
fread(pColorTable,sizeof(RGBQUAD),256,fp);
}
//申請點陣圖數據所需要的空間,讀點陣圖數據進內存
pBmpBuf=newunsignedchar[lineByte*bmpHeight];
fread(pBmpBuf,1,lineByte*bmpHeight,fp);
fclose(fp);//關閉文件
return1;//讀取文件成功
}
//-----------------------------------------------------------------------------------------
//給定一個圖像點陣圖數據、寬、高、顏色表指針及每像素所佔的位數等信息,將其寫到指定文件中
boolsaveBmp(char*bmpName,unsignedchar*imgBuf,intwidth,intheight,intbiBitCount,RGBQUAD*pColorTable)
{
//如果點陣圖數據指針為0,則沒有數據傳入,函數返回
if(!imgBuf)
return0;
//顏色表大小,以位元組為單位,灰度圖像顏色表為1024位元組,彩色圖像顏色表大小為0
intcolorTablesize=0;
if(biBitCount==8)
colorTablesize=1024;
//待存儲圖像數據每行位元組數為4的倍數
intlineByte=(width*biBitCount/8+3)/4*4;
//以二進制寫的方式打開文件
FILE*fp=fopen(bmpName,"wb");
if(fp==0)
return0;
//申請點陣圖文件頭結構變數,填寫文件頭信息
BITMAPFILEHEADERfileHead;
fileHead.bfType=0x4D42;//bmp類型
//bfSize是圖像文件4個組成部分之和
fileHead.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+colorTablesize+lineByte*height;
fileHead.bfReserved1=0;
fileHead.bfReserved2=0;
//bfOffBits是圖像文件前3個部分所需空間之和
fileHead.bfOffBits=54+colorTablesize;
//寫文件頭進文件
fwrite(&fileHead,sizeof(BITMAPFILEHEADER),1,fp);
//申請點陣圖信息頭結構變數,填寫信息頭信息
BITMAPINFOHEADERhead;
head.biBitCount=biBitCount;
head.biClrImportant=0;
head.biClrUsed=0;
head.biCompression=0;
head.biHeight=height;
head.biPlanes=1;
head.biSize=40;
head.biSizeImage=lineByte*height;
head.biWidth=width;
head.biXPelsPerMeter=0;
head.biYPelsPerMeter=0;
//寫點陣圖信息頭進內存
fwrite(&head,sizeof(BITMAPINFOHEADER),1,fp);
//如果灰度圖像,有顏色表,寫入文件
if(biBitCount==8)
fwrite(pColorTable,sizeof(RGBQUAD),256,fp);
//寫點陣圖數據進文件
fwrite(imgBuf,height*lineByte,1,fp);
//關閉文件
fclose(fp);
return1;
}
//----------------------------------------------------------------------------------------
//以下為像素的讀取函數
voiddoIt()
{
//讀入指定BMP文件進內存
charreadPath[]="nv.BMP";
readBmp(readPath);
//輸出圖像的信息
cout<<"width="<<bmpWidth<<"height="<<bmpHeight<<"biBitCount="<<biBitCount<<endl;
//循環變數,圖像的坐標
//每行位元組數
intlineByte=(bmpWidth*biBitCount/8+3)/4*4;
//循環變數,針對彩色圖像,遍歷每像素的三個分量
intm=0,n=0,count_xiang_su=0;
//將圖像左下角1/4部分置成黑色
ofstreamoutfile("圖像像素.txt",ios::in|ios::trunc);
if(biBitCount==8)//對於灰度圖像
{
//------------------------------------------------------------------------------------
//以下完成圖像的分割成8*8小單元,並把像素值存儲到指定文本中。由於BMP圖像的像素數據是從
//左下角:由左往右,由上往下逐行掃描的
intL1=0;
inthang=63;
intlie=0;
//intL2=0;
//intfen_ge=8;
for(intfen_ge_hang=0;fen_ge_hang<8;fen_ge_hang++)//64*64矩陣行循環
{
for(intfen_ge_lie=0;fen_ge_lie<8;fen_ge_lie++)//64*64列矩陣循環
{
//--------------------------------------------
for(L1=hang;L1>hang-8;L1--)//8*8矩陣行
{
for(intL2=lie;L2<lie+8;L2++)//8*8矩陣列
{
m=*(pBmpBuf+L1*lineByte+L2);
outfile<<m<<"";
count_xiang_su++;
if(count_xiang_su%8==0)//每8*8矩陣讀入文本文件
{
outfile<<endl;
}
}
}
//---------------------------------------------
hang=63-fen_ge_hang*8;//64*64矩陣行變換
lie+=8;//64*64矩陣列變換
//該一行(64)由8個8*8矩陣的行組成
}
hang-=8;//64*64矩陣的列變換
lie=0;//64*64juzhen
}
}
//doublexiang_su[2048];
//ofstreamoutfile("xiang_su_.txt",ios::in|ios::trunc);
if(!outfile)
{
cout<<"openerror!"<<endl;
exit(1);
}
elseif(biBitCount==24)
{//彩色圖像
for(inti=0;i<bmpHeight;i++)
{
for(intj=0;j<bmpWidth;j++)
{
for(intk=0;k<3;k++)//每像素RGB三個分量分別置0才變成黑色
{
//*(pBmpBuf+i*lineByte+j*3+k)-=40;
m=*(pBmpBuf+i*lineByte+j*3+k);
outfile<<m<<"";
count_xiang_su++;
if(count_xiang_su%8==0)
{
outfile<<endl;
}
//n++;
}
n++;
}
}
cout<<"總的像素個素為:"<<n<<endl;
cout<<"----------------------------------------------------"<<endl;
}
//將圖像數據存檔
charwritePath[]="nvcpy.BMP";//圖片處理後再存儲
saveBmp(writePath,pBmpBuf,bmpWidth,bmpHeight,biBitCount,pColorTable);
//清除緩沖區,pBmpBuf和pColorTable是全局變數,在文件讀入時申請的空間
delete[]pBmpBuf;
if(biBitCount==8)
delete[]pColorTable;
}
voidmain()
{
doIt();
}
㈧ 用C語言處理照片的分離調色問題
圖片格式有很多種bmp,jpg,gif,png等等每種都有自己的格式。處理圖片一般流程都是先讀取圖片文件,根據格式解析成點陣圖(bitmap)然後對點陣圖進行處理。所以重點是解析。這個是有很多的開源C庫的。
㈨ C語言打開圖像文件後讀取像素
C語言打開圖像文件後運用以下代碼就可以讀取像素,具體如下:
#ifndef IMAGE_H
#define IMAGE_H
void image_info(FILE* file);
void image_save(FILE *file);
void image_gray();
void image_binarization();
void image_opposite();
void image_channel(); //抽取RGB通道
void image_bright();//改變圖像亮度
typedef struct BMP
{
//14位元組
unsigned short bfType; //文件標識 2位元組 必須為BM
unsigned int bfSize; //文件大小 4位元組
unsigned short bfReserved1; //保留,每位元組以"00"填寫 2位元組
unsigned short bfReserved2; //同上 2位元組
unsigned int bfOffBits; //記錄圖像數據區的起始位置(圖象數據相對於文件頭位元組的偏移量)。 4位元組
//40位元組
unsigned int biSize; //表示本結構的大小 4位元組
int biWidth; //點陣圖的寬度 4位元組
int biHeight; //點陣圖的高度 4位元組
unsigned short biPlanes; //永遠為1 , 2位元組
unsigned short biBitCount; //點陣圖的位數 分為1 4 8 16 24 32 2位元組
unsigned int biCompression; //壓縮說明 4位元組
unsigned int biSizeImage; //表示點陣圖數據區域的大小以位元組為單位 4位元組
int biXPelsPerMeter; //用象素/米表示的水平解析度 4位元組
int biYPelsPerMeter; //用象素/米表示的垂直解析度 4位元組
unsigned int biClrUsed; //點陣圖使用的顏色索引數 4位元組
unsigned int biClrImportant; //對圖象顯示有重要影響的顏色索引的數目 4位元組
} BMP;
int line_byte;
unsigned char *imagedata;
extern BMP bmp;
extern int line_byte;
extern unsigned char *imagedata;
#endif
//image_rw.c文件
#include<stdio.h>
#include<stdlib.h>
#include"image.h"
void image_info(FILE *file)
{
int times=3; //輸入文件名次數。
char bmp_name[10]; //文件名
printf("\nplease enter a file name for reading:");
do
{
if (times<3)
{
printf("\nplease enter a file name for reading again:");
}
fflush(stdin);
gets(bmp_name);
//printf("\n%s",bmp_name);
file=fopen(bmp_name,"rb+"); //打開一個文件進行讀寫操作。
--times;
if (file==NULL)
{
printf("\nerror opening %s for reading! ",bmp_name);
}
else
{
break;
}
}
while(times!=0);
if (times==0)
{
printf("\nsorry, shutdown!");
exit(1);
}
//讀取圖像信息
fseek(file,0L,0); //讀取圖像文件類型
fread(&bmp,sizeof(BMP),1,file);
printf("\n bmp tpye: %u",bmp.bfType);
printf("\n bmp size: %u",bmp.bfSize);
printf("\n bmp reserved1: %u",bmp.bfReserved1);
printf("\n bmp reserved2: %u",bmp.bfReserved2);
printf("\n bmp offBits: %u",bmp.bfOffBits);
printf("\n bmp bisize: %u",bmp.biSize);
printf("\n bmp biWidth: %d",bmp.biWidth);
printf("\n bmp biHeight: %d",bmp.biHeight);
printf("\n bmp biplans: %u",bmp.biPlanes);
printf("\n bmp biBitCount: %u",bmp.biBitCount);
printf("\n bmp biCompression: %u",bmp.biCompression);
printf("\n bmp biSizeImage: %u",bmp.biSizeImage);
printf("\n bmp biXPelsPerMeter: %d",bmp.biXPelsPerMeter);
printf("\n bmp biYPelsPerMeter: %d",bmp.biYPelsPerMeter);
printf("\n bmp biClrUsed: %u",bmp.biClrUsed);
printf("\n bmp biClrImportant: %u\n",bmp.biClrImportant);
line_byte=(bmp.biWidth*bmp.biBitCount/8+3)/4*4; //獲得圖像數據每行的數據個數
//printf("dfsa%u",bmp.line_byte);
//bmp.imagedata=NULL;
imagedata=(unsigned char*)malloc(bmp.biSizeImage);
fseek(file,(long)bmp.bfOffBits,0);
fread(imagedata,sizeof(unsigned char),bmp.biSizeImage,file);
fclose(file);
}
//保存圖像
void image_save(FILE *file)
{
int times=3; //輸入文件名次數。
char bmp_name[10]; //文件名
//int i; //記錄數據區個數
printf("\nplease enter a file name for writeing:");
do
{
if (times<3)
{
printf("\nplease enter a file name for writeing again:");
}
fflush(stdin);
gets(bmp_name);
printf("\n%s",bmp_name);
file=fopen(bmp_name,"wb+"); //打開一個文件進行讀寫操作。
--times;
if (file==NULL)
{
printf("\nerror opening %s for writing",bmp_name);
}
else
{
break;
}
}
while(times!=0);
if (times==0)
{
printf("\nsorry, shutdown!");
exit(1);
}
//寫文件頭
printf("\n%s",bmp_name);
fseek(file,0L,0); //圖像文件類型
fwrite(&(bmp.bfType),sizeof(short),1,file);
printf("\n bmp tpye: %d",bmp.bfType);
fseek(file,2L,0); //圖像文件大小
fwrite(&(bmp.bfSize),sizeof(int),1,file);
printf("\n bmp size: %d",bmp.bfSize);
fseek(file,6L,0); //圖像文件保留字1
fwrite(&(bmp.bfReserved1),sizeof(short),1,file);
printf("\n bmp reserved1: %d",bmp.bfReserved1);
fseek(file,8L,0); //圖像文件保留字2
fwrite(&(bmp.bfReserved2),sizeof(short),1,file);
printf("\n bmp reserved2: %d",bmp.bfReserved2);
fseek(file,10L,0);//數據區的偏移量
fwrite(&(bmp.bfOffBits),sizeof(short),1,file);
printf("\n bmp offBits: %d",bmp.bfOffBits);
fseek(file,14L,0);//文件頭結構大小
fwrite(&(bmp.biSize),sizeof(int),1,file);
printf("\n bmp bisize: %d",bmp.biSize);
fseek(file,18L,0);//圖像的寬度
fwrite(&(bmp.biWidth),sizeof(int),1,file);
printf("\n bmp biWidth: %d",bmp.biWidth);
fseek(file,22L,0);//圖像的高度
fwrite(&(bmp.biHeight),sizeof(int),1,file);
printf("\n bmp biHeight: %d",bmp.biHeight);
fseek(file,24L,0);//圖像的面數
fwrite(&(bmp.biPlanes),sizeof(short),1,file);
printf("\n bmp biplans: %d",bmp.biPlanes);
fseek(file,28L,0);//圖像一個像素的位元組數
fwrite(&(bmp.biBitCount),sizeof(short),1,file);
printf("\n bmp biBitCount: %d",bmp.biBitCount);
fseek(file,30L,0);//圖像壓縮信息
fwrite(&(bmp.biCompression),sizeof(short),1,file);
printf("\n bmp biCompression: %d",bmp.biCompression);
fseek(file,34L,0);//圖像數據區的大小
fwrite(&(bmp.biSizeImage),sizeof(int),1,file);
printf("\n bmp biSizeImage: %d",bmp.biSizeImage);
fseek(file,38L,0);//水平解析度
fwrite(&(bmp.biXPelsPerMeter),sizeof(int),1,file);
printf("\n bmp biXPelsPerMeter: %d",bmp.biXPelsPerMeter);
fseek(file,42L,0);//垂直解析度
fwrite(&(bmp.biYPelsPerMeter),sizeof(int),1,file);
printf("\n bmp biYPelsPerMeter: %d",bmp.biYPelsPerMeter);
fseek(file,46L,0);//顏色索引數
fwrite(&(bmp.biClrUsed),sizeof(int),1,file);
printf("\n bmp biClrUsed: %d",bmp.biClrUsed);
fseek(file,50L,0);//重要顏色索引數
fwrite(&(bmp.biClrImportant),sizeof(int),1,file);
printf("\n bmp biClrImportant: %d\n",bmp.biClrImportant);
fseek(file,(long)(bmp.bfOffBits),0);
fwrite(imagedata,sizeof(unsigned char),bmp.biSizeImage,file);
fclose(file);
}
//pixProcess.c文件
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include"image.h"
//灰度化
void image_gray()
{
int i,j;
unsigned char tmp;
for (i=0;i<bmp.biHeight;i++)
{
for (j=0;j<line_byte/3;j++)
{
tmp=0.11*(*(imagedata+i*line_byte+j*3+0))+0.59*(*(imagedata+i*line_byte+j*3+1))+0.3*(*(imagedata+i*line_byte+j*3+2));
imagedata[i*line_byte+j*3+0]=tmp;
imagedata[i*line_byte+j*3+1]=tmp;
imagedata[i*line_byte+j*3+2]=tmp;
//printf("\nnidsfh%d %d",i,j);
}
}
}
//二值化
void image_binarization()
{
int i,j;
for (i=0;i<bmp.biHeight;i++)
{
for (j=0;j<line_byte;j++)
{
if ((*(imagedata+i*line_byte+j))<128)
{
imagedata[i*line_byte+j]=0;
}
else
{
imagedata[i*line_byte+j]=255;
}
}
}
}
void image_opposite() //反相
{
int i,j;
for (i=0;i<bmp.biHeight;i++)
{
for (j=0;j<line_byte;j++)
{
imagedata[i*line_byte+j]=abs(255-imagedata[i*line_byte+j]);
}
}
}
void image_channel() //抽取RGB通道
{
int i,j;
char rgb;
printf("\nplease enter a char(r/g/b): ");
fflush(stdin);
scanf("%c",&rgb);
if (rgb=='b')
{
for (i=0;i<bmp.biHeight;i++)
{
for (j=0;j<line_byte/3;j++)
{
imagedata[i*line_byte+3*j+1]=0;
imagedata[i*line_byte+3*j+2]=0;
}
}
}
else if(rgb=='g')
{
for (i=0;i<bmp.biHeight;i++)
{
for (j=0;j<line_byte/3;j++)
{
imagedata[i*line_byte+3*j]=0;
imagedata[i*line_byte+3*j+2]=0;
}
}
}
else
{
for (i=0;i<bmp.biHeight;i++)
{
for (j=0;j<line_byte/3;j++)
{
imagedata[i*line_byte+3*j]=0;
imagedata[i*line_byte+3*j+1]=0;
}
}
}
}
void image_bright()//改變圖像亮度
{
int level;
int i,j;
printf("\n please enter the level of brightness[-255 to 255] :");
fflush(stdin);
scanf("%d",&level);
for (i=0;i<bmp.biHeight;i++)
{
for (j=0;j<line_byte;j++)
{
if (level>=0)
{
if ((imagedata[i*line_byte+j]+level)>255)
imagedata[i*line_byte+j]=255;
else
imagedata[i*line_byte+j]+=level;
}
else
{
if ((imagedata[i*line_byte+j]-abs(level))<0)
imagedata[i*line_byte+j]=0;
else
imagedata[i*line_byte+j]+=level;
}
}
}
}
//void image_create() //創建一幅24位BMP圖像文件。
//{
//main.c文件
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
#include"image.h"
BMP bmp;
int main()
{
FILE *file=NULL;
int choose;
char gono;
do
{
image_info(file); //imagedata已經分配了動態內存,但是沒有釋放
printf("\n 1.image_opposite");
printf("\n 2.image_gray");
printf("\n 3.image_binarization");
printf("\n 4.image_channel");
printf("\n 5.image_brightness");
//printf("6.image_opposite");
//printf("7.image_opposite");
printf("\nchoose your options:");
fflush(stdin);
scanf("%d",&choose);
switch(choose)
{
case 1:
image_opposite();
image_save(file);
free(imagedata);
break;
case 2:
image_gray();
image_save(file);
free(imagedata);
break;
case 3:
image_binarization();
image_save(file);
free(imagedata);
break;
case 4:
image_channel();
image_save(file);
free(imagedata);
break;
case 5:
image_bright();
image_save(file);
free(imagedata);
break;
default:
printf("\n wrong choose!");
}
printf("\nlet's go on?(y/n):");
fflush(stdin);
scanf("%c",&gono);
if (gono=='n')
{
printf("\nbye bye!");
break;
}
}
while(1);
return 0;
}
㈩ 怎麼用c語言把bmp文件里的白色像素轉換為紅色
代碼如下:
#include<stdio.h>
#include<math.h>
#include<Windows.h>
#defineWIDTHBYTES(bits)(((bits)+31)/32*4)
//保存點陣圖
voidSaveBitmap(
PBITMAPFILEHEADERpFileHdr,
PBITMAPINFOHEADERpInfoHdr,
LPRGBQUADpRGBQUAD,
size_tpaletteNum,
constunsignedchar*bmpData,
size_tbmpDataSize,
constchar*file)
{
FILE*pf=fopen(file,"wb");
fwrite(pFileHdr,sizeof(BITMAPFILEHEADER),1,pf);
fwrite(pInfoHdr,sizeof(BITMAPINFOHEADER),1,pf);
if(pRGBQUAD!=NULL){
fwrite(pRGBQUAD,paletteNum*sizeof(RGBQUAD),1,pf);
}
fwrite(bmpData,bmpDataSize,1,pf);
fclose(pf);
}
//轉換點陣圖,將白色像素轉換為紅色
voidConvertBitmap(constchar*file,constchar*new_file)
{
FILE*pf=fopen(file,"rb");
//讀取文件頭
BITMAPFILEHEADERfileHeader;
memset(&fileHeader,0,sizeof(fileHeader));
fread(&fileHeader,sizeof(fileHeader),1,pf);
//讀取信息頭
BITMAPINFOHEADERinfoHeader;
memset(&infoHeader,0,sizeof(infoHeader));
fread(&infoHeader,sizeof(infoHeader),1,pf);
switch(infoHeader.biBitCount){
//處理24位點陣圖
case24:{
//讀取點陣圖數據
fseek(pf,fileHeader.bfOffBits,SEEK_SET);
unsignedchar*bmpData=(unsignedchar*)malloc(infoHeader.biSizeImage);
fread(bmpData,infoHeader.biSizeImage,1,pf);
//修改點陣圖,將白色像素轉換為紅色像素,這里只是簡單的替換
intwidthBytes=WIDTHBYTES(infoHeader.biWidth*infoHeader.biBitCount);
for(inti=0;i<infoHeader.biHeight;i++){
unsignedchar*line=bmpData+widthBytes*i;
for(intj=0;j<infoHeader.biWidth;j++){
intoffset=j*(infoHeader.biBitCount/8);
if(line[offset]==0xff&&
line[offset+1]==0xff&&
line[offset+2]==0xff){
line[offset]=0x00;
line[offset+1]=0x00;
line[offset+2]=0xff;
}
}
}
//保存
SaveBitmap(&fileHeader,&infoHeader,NULL,0,bmpData,infoHeader.biSizeImage,new_file);
free(bmpData);
break;
}
//處理8位,4位點陣圖
case8:
case4:{
//讀取調色板數據
longpaletteNum=(long)pow(2.0,infoHeader.biBitCount);
RGBQUAD*pRGBQUAD=(RGBQUAD*)malloc(paletteNum*sizeof(RGBQUAD));
fread(pRGBQUAD,paletteNum*sizeof(RGBQUAD),1,pf);
//讀取點陣圖數據
fseek(pf,fileHeader.bfOffBits,SEEK_SET);
unsignedchar*bmpData=(unsignedchar*)malloc(infoHeader.biSizeImage);
fread(bmpData,infoHeader.biSizeImage,1,pf);
//查找顏色索引
BYTEwhiteIdx=0;
BYTEredIdx=0;
for(longi=0;i<paletteNum;i++){
if(pRGBQUAD[i].rgbRed==0xff&&
pRGBQUAD[i].rgbGreen==0xff&&
pRGBQUAD[i].rgbBlue==0xff){
whiteIdx=i;
}
if(pRGBQUAD[i].rgbRed==0xff&&
pRGBQUAD[i].rgbGreen==0x00&&
pRGBQUAD[i].rgbBlue==0x00){
redIdx=i;
}
}
//修改點陣圖,將白色像素轉換為紅色像素,這里只是簡單的替換
intwidthBytes=WIDTHBYTES(infoHeader.biWidth*infoHeader.biBitCount);
for(inti=0;i<infoHeader.biHeight;i++){
unsignedchar*line=bmpData+widthBytes*i;
for(intj=0;j<widthBytes;j++){
if(infoHeader.biBitCount==8){
if(line[j]==whiteIdx){
line[j]=redIdx;
}
}
elseif(infoHeader.biBitCount==4){
if((line[j]&0x0f)==whiteIdx){
line[j]=line[j]&0xf0|redIdx;
}
if(((line[j]>>4)&0x0f)==whiteIdx){
line[j]=(line[j]&0x0f)|((redIdx<<4)&0xf0);
}
}
}
}
//保存
SaveBitmap(&fileHeader,&infoHeader,pRGBQUAD,paletteNum,bmpData,infoHeader.biSizeImage,new_file);
free(bmpData);
free(pRGBQUAD);
break;
}
}//endofswitch
fclose(pf);
}
intmain()
{
ConvertBitmap("images/test24.bmp","images/test24_new.bmp");
ConvertBitmap("images/test16.bmp","images/test16_new.bmp");
ConvertBitmap("images/test256.bmp","images/test256_new.bmp");
ConvertBitmap("images/test_bin.bmp","images/test_bin_new.bmp");
system("pause");
return0;
}
運行結果: