當前位置:首頁 » 編程語言 » c語言對點陣圖數據進行縮小
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言對點陣圖數據進行縮小

發布時間: 2023-05-17 04:22:36

⑴ 新手請教:c語言處理點陣圖

你沒有把文件的內容讀進結構體裡面,當然結果不可預料
而且,如果你直接fread(&bmfHeader, sizeof(bmfHeader), 1, fp)也可能會出錯,因為編譯器在編譯結構體的時候,為了加快訪問,會進行結構體的對齊操作。

所以你要逐一欄位地讀取bmp圖像的信息單元

⑵ 求一個C語言圖形變換程序,先進行圖形繪制,後能進行圖形復制、移動、縮放、旋轉,跪求啦。。。

從這一部分開始,進入了圖形編程的比較煩瑣的部分,要真正對圖形編程有所了解,這一部分的內容是必須要掌握的。

在計算機繪圖過程中,經常需要進行繪圖變換,主要包括二維圖形變換和三維圖形變換。這一部分討論二維圖形變換,其內容有用戶坐標到屏幕坐標的變換、圖形的比例變換、對稱變換、錯切變換、旋轉變換、平移變換和復合變換等。後面講到了二維剪裁,即線段裁剪與多邊形裁剪。

第一節 用戶坐標到屏幕坐標變換

假設紙上有一個圖形,要用計算機把它在屏幕上畫出來。那麼首先遇到的問題是,紙上的圖形採用的坐標是實數域域中的直角坐標系或是極坐標系,統稱為用戶坐標系。而屏幕上採用的坐標系是整數域中直角坐標系,這類坐標系統稱為設備坐標系。因此用戶坐標系中圖形需要經過變換才能繪制在屏幕上,顯然這個變換的內容包括: 1)將用戶坐標系中任意范圍區域轉換到屏幕某個范圍區域,從而用戶坐標系此范圍區域內的圖形也轉換到屏幕上該范圍區域內。 2)用戶坐標系此區域內圖形上的坐標值轉換到屏幕上該范圍區域內後不一定是整數,取整後才成為該范圍區域內的屏幕坐標值。 3)用戶坐標右手繫到屏幕坐標左手系的坐標軸方向變換。 4)當屏幕坐標系水平方向與垂直方向刻度不等(即像素間距不等)時,為保持圖形不走樣,還要進行比例變換。下面介紹這些內容的具體計算問題。

1.窗口到視口的變換

更確切地說,是實際圖形到屏幕圖形的轉換。有時也稱為數據規格化。

在用戶坐標系中,指定一矩形域以確定要顯示(或繪制)的圖形部分,這個矩形區域稱為窗口。在屏幕上可任選一矩形域以顯示(或繪制)窗口內的圖形,該域稱為視口。如圖2-1所示。

一般視窗口的四條邊界分別為:

左邊界 x=x1、右邊界 x=x2.下邊界 y=y1,上邊界y=y2。

視口的四條邊界分別為:

左邊界sx=sx1,右邊界sx=sx2,上邊界sy=sy1,下邊界sy=sy2。

經變換後應有,窗口的上邊界線段(或下邊界線段)長x2-x1變換成視口上邊界線段(或下邊界線段)長sx2-sx1。設其比例變換因子為k1,則可得

k1*(x2-x1)=sx2-sx1

k1=(sx2-sx1)/(x2-x1)

對窗口內任一x坐標(x1<=x<=x2)變換後為視口內水平方向sx坐標(sx1<=sx<=sx2)。由上述有:

k1*(x-x1)=sx-sx1

sx=sx1+k1*(x-x1)

=sx1+(x-x1)*(sx2-sx1)/(x2-x1)

同樣,經變換後窗口的左邊界線段(或右邊界線段)長y2-y1變換成視口左邊界線段(或右邊界線段)長sy2-sy1。設其比例變換因子為k2,則可得

k2*(y2-y1)=sy2-sy1

k2=(sy2-sy1)/(y2-y1)

對窗口內任一y坐標(y1<=y<=y2)變換後為視口內垂直sy坐標(sy1<=sy<=sy2),應有

k2*(y-y1)=sy-sy1

sy=sy1+k2*(y-y1)

=sy1+(y-y1)*(sy2-sy1)/(y2-y1)

於是對窗口內圖形上任一點坐標(x,y)變換到屏幕上視口內成為(sx,sy),則

sx=sx1+(x-x1)*(sx2-sx1)/(x2-x1)

sy=sy1+(y-y1)*(sy2-sy1)/(y2-y1)

寫成簡式

sx=k1*x+a

sy=k2*y+b

這里

a=sx1-k1*x1

b-sy1-k2*y1

k1=(sx2-sx1)/(x2-x1)

k2=(sy2-sy1)/(y2-y1)

2. 實型值到整型值的變換

上面對窗口內圖形上任一點坐標(x,y)變換到屏幕上視口內成為(sx,sy),

sx=k1*x+a

sy=k2*y+b k1,k2,a,b同上

這樣計算出來的sx,sy一般是實型值,而屏幕上視口內屏幕坐標是整型值,因此要將sx,sy實型值轉換成屏幕坐標系的整型值。這可以通過四捨五入的方法將實型值的絕對值圓整化。由於C語言中已經替我們想到了這點,它提供的函數可以自動取整,因此用戶在調用標准函數在屏幕上繪圖時一般不需要考慮這個問題。當然也可以用賦值的類型轉換規則來實現實型值到整型值的變換。

3. y坐標值方向變換

一般屏幕坐標系是直角左手系,y軸方向向下為正,原點在屏幕的左上角,如圖2-2所示。

窗口內圖形上任一點(x,y)變換到視口內成為(sx,xy),而(x,y)是相對用戶坐標系(直角右手系)的。(sx,sy)是相對屏幕坐標系(直角左手系)的,因此y軸方向相反。為使窗口內圖形變換到視口上圖形其形狀一致,需將視口上圖形y軸方向變換成窗口內圖形y軸方向。這只要將求得的視口內各點的sy整型坐標均用sy2去減,即sy2-sy(整型)代替sy(整型)即可,經這樣的坐標軸方向變換後得到的視口內圖形與窗口內圖形一致。

4.長寬比例變換

屏幕坐標系x方向與y方向上的刻度可能不一樣,這取決於水平方向像素間距與垂直方向偈素間距大小是否一致。如果兩個方向的刻度不相等,那麼用戶坐標系下一個正方形將顯示(或繪制)成為一個長方形有,一個圓將成為一個橢圓。

為保持原圖形的長寬比。使圖形顯示(或繪制)後不走樣,需求出屏幕上兩侍標軸刻度的比值(即縱橫比)。可以用函數getaspectratio()(見前文所述)返回x方向和y方向的比例數,從而求得這個比值。再瘵原圖形y方向坐標乘以該比值,這樣顯示(或繪制)出來的圖形應不走樣。若不考慮圖形的走樣,就不必作這個變換。

第二節 二維幾何變換

圖形的幾何變換一般是指對圖形的幾何信息經過變換後產生新的圖形,圖形幾何變換既可以看作是坐標系不動而圖形變動,變動後的圖形在坐標系中的坐標值發生變化;出可以看作圖形不動而坐標系變動,變動後的圖形在新坐標系下具有新的坐標值。這兩種情況本質上都是一樣的,都是圖形由新的坐標值表示,因此是新產生的圖形。圖形幾何變換包括比例變換、對稱變換、錯切變換、旋轉變換、平移變換及其復合變換。圖形上所有的點在幾何變換前後的坐標關系一般用解析幾何方法可以求得,但這些幾何關系用矩陣方法表示,運算更為方便。

一、基本變換

圖形基本幾何變換是指比例變換、對稱變換、錯切變換、旋轉變換和平移變換等。除平移變換外,這里其它四種幾何變換都可以用組成圖形的點向量(或稱1×2階矩陣)和2×2階變換矩陣相乘表示,而平移變換需引入新方法來實現。

1、比例變換

設圖形上一點P(x,y),經比例變換後成為新的菜上一點P'(x',y'),即有

x'=a*x

y'=d*y

式中a,d為比例因子

將此比例變換式寫成矩陣式得

a 0

[x' y']=[x y] = [x y] * T

0 d

a 0

這里 T= 叫做比例變換矩陣。若a=d,則x,y坐標按同一比例變換。

0 d

當a=d>1時,圖形放大;當0<a=d<1時,圖形縮小。

若a≠d,則x,y坐標按各自不同比例變換。

3 0

例 1: 設有比例變換矩陣 T= , 三角形abc經過比例變換成為三角形a'b'c'。

0 1

如圖2-3所示。

3 0

a [1 2] = [3 2] a'

0 1

3 0

b [2 2] = [6 2] b'

0 1

3 0

c [2 3] = [6 3] c'

0 1

2. 對稱變換

圖形上一點P(x,y)經關於原點對稱變換後成為新圖形上一點P'(x',y'),則

x' = -x

y' = -y

寫成矩陣形式成為

-1 0

[x' y'] = [x y] = [x y] * T

0 -1

-1 0

這里 T = 為關於原點對稱變換矩陣。

0 -1

若關於x軸對稱,則對稱變換的矩陣表示為

1 0

[x' y'] = [x y] = [x y] * T

0 -1

1 0

於是關於x軸對稱變換矩陣 T =

0 -1

若關於y軸對稱,則對稱變換的矩陣表示為

-1 0

[x' y'] = [x y] = [x y] * T

0 1

-1 0

於是關於y軸對稱變換矩陣 T =

0 1

若關於直線y = -x對稱,則對稱變換矩陣表示為

0 -1

[x' y'] = [x y] = [x y] * T

-1 0

0 1

於是關於直線 y = x對稱變換矩陣 T =

1 0

各種對稱變換的圖形均可由實常式序繪出,參見實常式序圖形。

3. 錯切變換

對圖形的任一點P(x,y),作線性變換如下

x' = x + by

y' = y + dx

式中b,d為不全為零的常 數,點P'(x',y')為新圖形上相應的點,這個變換稱為圖形的錯切變換。

錯切變換的矩陣表示為

1 d

[x' y'] = [x y] = [x y] * T

b 1

1 d

T = 叫做錯切變換矩陣(b,d不全為零)。

b 1

① 當d=0時,x'=x+by,y'=y,這時圖形的y坐標不變,x坐標值隨(x,y)及系數b作線性變化。若b>0時,圖形沿x軸作錯切位移;若b<0,圖形沿x軸負向作錯切位移。

② 當b=0時,x'=x,y'=dx+y,此時圖形的x坐標不變y坐標隨(x,y)及系數d作線性變化。如d>0,圖形沿y軸正向作錯切位移;如d<0,圖形沿y軸負向作錯切位移。

③ 當b≠0且d≠0時,x'=x+by,y'=y+dx,圖形沿x,y兩個方向作錯切位移。

1 2

例 2: 設有錯切變換 矩陣 T = ,正方形abcd經此錯切變換成為四邊形a'b'c'd',

0 1

如圖2-4所示。

1 2

a [0 0] = [0 0] a'

0 1

1 2

b [1 0] = [1 2] b'

0 1

1 2

c [1 1] = [1 3] c'

0 1

1 2

d [0 1] = [0 1] d'

0 1

4. 旋轉變換

設圖形上一點P(x,y)繞原點逆時針旋轉θ角後成為新的圖形上一點P'(x',y'),則由解析幾何方法可得

x' = xcosθ + ysinθ

y' = -xsinθ + ycosθ

用矩陣表示為

cosθ -sinθ

[x' y'] = [x y] = [x y] * T

sinθ cosθ

cosθ -sinθ

這里 T = 為繞原點逆時針變換矩陣。若順時針旋轉時,θ角為負值。

sinθ cosθ

5. 平移變換

若圖形上一點P(x,y)沿x軸平移 l距離,沿y軸平移m距離後成為新的圖形上一點P'(x',y'),則有

x' = x + l

y' = y + m

式中l,m不全為零,這稱為平移變換。但此變換無法用組成圖形的點向量和2×2階變換矩陣相乘來實現。

用二維點向量和2×2階矩陣相乘不能表示圖形的平移變換,那麼自然會想到用三維點向量和3×3階矩陣相乘來實現圖形的平移變換。因此對圖形上二個坐標的點向量需要添加一個坐標,使之成為三維點向量以便與三階矩陣相乘,進而實現用矩陣表示平移變換。實際上就是對上面的二個坐標變換式添加第三個坐標變換式,即成為

x' = x + l

y' = y + m

k = k

這第三個坐標變換式(即k=k)必須是恆等式,因為不需作變換,本質上是為了進行矩陣運算而引入的。

將此三個變換式(仍然是圖形的平移變換,不妨將k = k取成1=1)寫成矩陣得

1 0 0

[x' y' l] = [x y l] 0 1 0 = [x y 1] * T

l m 1

1 0 0

顯然 T = 0 1 0 為圖形的平移變換矩陣。

l m 1

這里通過對原圖形上二維點向量引進第三個坐標成為三維點向量,從而使原圖形的平移變換 能用矩陣表示。同樣其它基本變換也可以如此用矩陣表示。因此圖形的基本變換都可以在這樣的三維點向量下統一、整齊用矩陣表示。這樣的三維點向量稱為齊次點向量,也叫三維齊次坐標點,簡稱三維齊次坐標。只有在三維齊次坐標下,二維幾何變換才都可以用矩陣表示。下面再進一步討論一下齊次坐標的優點。

引用齊次坐標後,可將上面各種基本變換矩陣統一在一個三階矩陣中。即

a b 0

T = c d 0

l m 1

式中左上角二階矩陣實現比例、對稱、錯切、旋轉等變換,左下角1×2階矩陣實現平移變換,其中a,b,c,d,l,m只要賦以相應的值,並建立圖形上點的齊次坐標(即在圖形上點的坐標後引入第三個坐標1),這樣就可以用圖形上點的三維齊次坐標與此三階矩陣相乘來表示三維圖形的基本幾何變換了。而變換後,不用考慮第三個坐標1,前面兩個坐標就反映了圖形的整個變換情況。

用齊次坐標表示一個圖形上的點,可以有多種表示,如(6,8,1)、(12,16,2)、(30,40,5)等均表示圖形上同一個點(6,8)。這樣,齊次坐標可以表示計算機無法容納的數。例如當計算機的字長為16位時,它能表示的最大整數為216-1=32767。若點坐標為(80 000,40 000),則計算機無法表示。但用齊次坐標可表示為(20 000,10 000,1/4),經過處理後再用第三個坐標支除前面兩個坐標,從而得到原來通常的坐標。

齊次坐標優點很多,在計算機繪圖中都採用這種表示來處理圖形。下面介紹的圖形復合幾何變換就是如此。

二、復合變換

圖形的復合幾何變換是指圖形作一次以上的基本幾何變換,變換結果是每次基本變換矩陣的乘積。圖殂的復合幾何變換簡稱復合變換。

1. 復合平移

若對圖形首先作平移變換 T1,然後再作平移變換T2,相應的平移變換矩陣分別為

1 0 0

T1 = 0 1 0

l1 m1 1

1 0 0

T2 = 0 1 0

l2 m2 1

則變換結果為復合平移變換T,其復合平移變換矩陣為

T = T1 * T2

1 0 0 1 0 0

= 0 1 0 * 0 1 0

l1 m1 1 l2 m2 1

1 0 0

= 0 1 0

l1+l2 m1|m2 1

⑶ 如何用C語言讀取BMP單色點陣圖,然後在這個點陣圖中裁減一小塊並另存為一個BMP單色點陣圖。

找一個介紹bmp結構的網頁,按照其結構讀取相應位置的數據,然後將這段數據加上bmp結裂李構的信息頭肆森遲春洞,就可以了。

⑷ 用C語言編寫程序處理圖片bmp文件 1.讀取圖片的寬度,高度,每個像素所需的位數,水平解析度,垂直

#include<windows.h>
//讀bmp圖片需要兩個結構
#pragmapack(push,enter_defBM,1)//指定內存對齊單位為1。
typedefstructtagBmpFileHeader
{
WORDbfType;//文件類型BM
DWORDbfSize;//文件大小
WORDbfReserved1;//保留字
WORDbfReserved2;//保留字
DWORDbfOffBits;//點陣圖的數據信息離文件頭的偏移量
}BFH;
typedefstructtagBmpImgHeader
{
DWORDbiSize;//表示本結構的大小,0X28
LONGbiWidth;//點陣圖的寬度
LONGbiHeight;//點陣圖的高度
WORDbiPlanes;//位面數永遠為1
WORDbiBitCount;//點陣圖的位數
DWORDbiCompression;//壓縮類型
DWORDbiSizeImage;//表示點陣圖數據區域的大小
LONGbiXPelsPerMeter;//表示顯示設備的水平解析度
LONGbiYPelsPerMeter;//表示顯示設備的垂直解析度
DWORDbiClrUsed;//實際使用的顏色數目
DWORDbiClrImportant;//重要的顏色數量
}BIH;
#pragmapack(pop,enter_defBM)//恢復默認內存對齊單位。

#defineHDIBHANDLE//點陣圖句柄


DWORDWINAPIDIBNumColors(BYTE*data)
{
WORDwBitCount;
DWORDdwClrUsed=((BIH*)data)->biClrUsed;
if(dwClrUsed!=0)return(WORD)dwClrUsed;
wBitCount=((BIH*)data)->biBitCount;
return1<<wBitCount;
}


WORDWINAPIPaletteSize(BYTE*data)
{
return(WORD)(::DIBNumColors(data)*sizeof(RGBQUAD));
}
BYTE*WINAPIFindDIBBits(BYTE*data)
{
return(data+*(DWORD*)data+::PaletteSize(data));
}

//獲取Bmp的寬度
DWORDFARDIBWidth(constBYTE*data)
{
BIH*pbmi;
pbmi=(BIH*)data;
if(pbmi->biSize==sizeof(BIH))returnpbmi->biWidth;
elsereturn-1;
}
//獲取Bmp的高度
DWORDFARDIBHeight(constBYTE*data)
{
BIH*pbmi;
pbmi=(BIH*)data;
if(pbmi->biSize==sizeof(BIH))returnpbmi->biHeight;
elsereturn-1;
}
//從文件讀取Bmp圖像數據
HDIBWINAPIReadDIBFile(FILE*fp)
{
BFHbmf;
HDIBhDIB;
BYTE*pData;

rewind(fp);
if(fread(&bmf,sizeof(BFH),1,fp)!=1)returnNULL;//文件讀取錯誤
if(bmf.bfType!=19778)returnNULL;//文件類型錯誤
hDIB=(HDIB)::GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT,bmf.bfSize);//為DIB分配內存
if(hDIB==0)returnNULL;//內存分配失敗。
pData=(BYTE*)::GlobalLock((HGLOBAL)hDIB);//鎖定
if(fread(pData,1,bmf.bfSize-sizeof(BFH),fp)!=(bmf.bfSize-sizeof(BFH)))//文件讀取錯誤
{
::GlobalUnlock((HGLOBAL)hDIB);//解除鎖定
::GlobalFree((HGLOBAL)hDIB);//釋放內存
returnNULL;
}
::GlobalUnlock((HGLOBAL)hDIB);//解除鎖定
returnhDIB;//返回DIB句柄
}

BOOLWINAPIPaintDIB(HDChDC,intposX,intposY,HDIBhDIB)
{
BYTE*pDIBHd;//BITMAPINFOHEADER指針
BYTE*pDIBBits;//DIB象素指針
BOOLbSuccess=FALSE;//成功標志
HPALETTEhPal=NULL;//DIB調色板
//HPALETTEhOldPal=NULL;//以前的調色板
if(hDIB==NULL)returnFALSE;//判斷DIB對象是否為空
pDIBHd=(BYTE*)::GlobalLock((HGLOBAL)hDIB);//鎖定DIB
pDIBBits=::FindDIBBits(pDIBHd);//找到DIB圖像象素起始位置
::SetStretchBltMode(hDC,COLORONCOLOR);//設置顯示模式
//調用SetDIBitsToDevice()來繪制DIB對象
bSuccess=::SetDIBitsToDevice(hDC,//hDC
posX,posY,
((BIH*)pDIBHd)->biWidth,//nDestWidth
((BIH*)pDIBHd)->biHeight,//nDestHeight
0,//SrcX
0,//SrcY
0,//nStartScan
(WORD)DIBHeight(pDIBHd),//nNumScans
pDIBBits,//lpBits
(LPBITMAPINFO)pDIBHd,//lpBitsInfo
DIB_RGB_COLORS);//wUsage
::GlobalUnlock((HGLOBAL)hDIB);//解除鎖定
returnbSuccess;
}
//列印點陣圖信息
VOIDWINAPIPrintDIBInfo(HDIBhDIB)
{
BYTE*pDIBHd=(BYTE*)::GlobalLock((HGLOBAL)hDIB);
BIH*pbmi=(BIH*)pDIBHd;
constchar*lp[]=
{
"點陣圖信息長度:%d ",
"點陣圖圖像大小:%dx%d ",
"位面數:%d ",
"點陣圖顏色深度:%d ",
"點陣圖數據壓縮類型:%d ",
"點陣圖數據區域大小:%d ",
"點陣圖解析度:水平%ddpi,垂直%ddpi ",
};
printf("WindowsV3cBitmapInfoHeader信息 ");
printf(lp[0],pbmi->biSize);
printf(lp[1],pbmi->biWidth,pbmi->biHeight);
printf(lp[2],pbmi->biPlanes);
printf(lp[3],pbmi->biBitCount);
printf(lp[4],pbmi->biCompression);
printf(lp[5],pbmi->biSizeImage);
printf(lp[6],(LONG)(pbmi->biXPelsPerMeter*0.0254f+0.5f),(LONG)(pbmi->biYPelsPerMeter*0.0254f+0.5f));
::GlobalUnlock((HGLOBAL)hDIB);//解除鎖定
}intmain(intargc,char*argv[])
{
HDIBx;
FILE*fp=fopen("1.bmp","rb");
if(fp==NULL)return-1;
x=ReadDIBFile(fp);
printf("DIBhandle%u",x);
PaintDIB(GetDC(NULL),0,0,x);
PrintDIBInfo(x);
return0;
}

⑸ 利用c語言怎樣對bmp圖像進行平移的操作

點陣圖平移沒有這方面的庫函數,必須自己來實現,下面是點陣圖平移的參考代碼:


#include "stdafx.h"

#include<windows.h>

#include<stdio.h>

#include<math.h>

int _tmain(int argc, _TCHAR* argv[])

{

int width;

int height;

RGBQUAD *pTableColor;

unsigned char *pBmpBuf1,*pBmpBuf2;

BITMAPFILEHEADER bfhead;

BITMAPINFOHEADER bihead;

//讀出源圖像的信息

FILE *fpr=fopen("E:\picture\dog.bmp","rb");

if(fpr==0)

return 0;

fread(&bfhead,14,1,fpr);

fread(&bihead,40,1,fpr);

width=bihead.biWidth;

height=bihead.biHeight;

int LineByte=(width*8/8+3)/4*4;

pTableColor=new RGBQUAD[256];

fread(pTableColor,sizeof(RGBQUAD),256,fpr);

pBmpBuf1=new unsigned char[LineByte*height];

fread(pBmpBuf1,LineByte*height,1,fpr);

fclose(fpr);

//將處理後的圖像賦值為白色

pBmpBuf2=new unsigned char[LineByte*height];

for(int i=0;i<height;i++)

for(int j=0;j<width;j++)

{

unsigned char *p;

p=(unsigned char*)(pBmpBuf2+LineByte*i+j);

(*p)=255;

}

//左右平移功能的實現

int t;

printf("請輸入左平移或右平移的大小t(左移t<0,右移t>0):");

scanf("%d",&t);

int k=abs(t);

printf("%d",k);

if(t<0)

{

if(t>=(-width))

{

for(int i=0;i<height;i++)

for(int j=0;j<(width-k);j++)

{

unsigned char *p1,*p2;

p1=pBmpBuf1+LineByte*i+j+k;

p2=pBmpBuf2+LineByte*i+j;

(*p2)=(*p1);

}

}

}

else

{

if(t<=width)

{

for(int i=0;i<height;i++)

for(int j=k;j<width;j++)

{

unsigned char *p1,*p2;

p1=pBmpBuf1+LineByte*i+j-k;

p2=pBmpBuf2+LineByte*i+j;

(*p2)=(*p1);

}

}

}

//保存處理後的圖像

FILE *fpw=fopen("dog.bmp","wb");

fwrite(&bfhead,14,1,fpw);

fwrite(&bihead,40,1,fpw);

fwrite(pTableColor,sizeof(RGBQUAD),256,fpw);

fwrite(pBmpBuf2,LineByte*height,1,fpw);

fclose(fpw);

return 0;

}

⑹ 求處理圖片bmp文件的程序代碼(C語言)

bmp文件由文件頭,點陣圖信息頭,顏色表,和數據部組成

文件頭:


{
WORDbfType;//點陣圖文件的類型,必須為BM(1-2位元組)
DWORDbfSize;//點陣圖文件的大小,以位元組為單位(3-6位元組,低位在前)
WORDbfReserved1;//點陣圖文件保留字,必須為0(7-8位元組)
WORDbfReserved2;//點陣圖文件保留字,必須為0(9-10位元組)
DWORDbfOffBits;//點陣圖數據的起始位置,以相對於點陣圖(11-14位元組,低位在含巧前)
//文件頭的偏移量表示,以位元組為單位
}BITMAPFILEHEADER;

點陣圖信息頭:

{
DWORDbiSize;//本結構所佔用位元組數(15-18位元組)
LONGbiWidth;//點陣圖的寬度,以像素為單位(19-22位元組)
LONGbiHeight;//點陣圖的高度,以像素為單位(23-26位元組)
WORDbiPlanes;//目標設備的級別,必須為1(27-28位元組)
WORDbiBitCount;//每個像素所需的位數,必須是1(雙色),(29-30位元組)
//4(16色),8(256色)16(高彩色)或24(真彩色)之一
DWORDbiCompression;//點陣圖壓縮類型昌老歷,必須是0(不壓縮),(31-34位元組)
//1(BI_RLE8壓縮類型)或2(BI_RLE4壓縮類型)之一
DWORDbiSizeImage;//點陣圖的大小(其中包含了為了補齊行數是4的倍數而添耐搜加的空位元組),以位元組為單位(35-38位元組)
LONGbiXPelsPerMeter;//點陣圖水平解析度,每米像素數(39-42位元組)
LONGbiYPelsPerMeter;//點陣圖垂直解析度,每米像素數(43-46位元組)
DWORDbiClrUsed;//點陣圖實際使用的顏色表中的顏色數(47-50位元組)
DWORDbiClrImportant;//點陣圖顯示過程中重要的顏色數(51-54位元組)
}BITMAPINFOHEADER;

打開文件讀出這些信息,然後用一個RGB的構造體二維數組(height*width)來讀取數據部分

⑺ c語言 點陣圖操作

對於一個24位色的圖,你直接就拿int(32位機器,長度32位)型二維數組存就行了。肯定能存這個24位數,沒必要把顏色分開存。如果分開存你就用下面的結構體數組的方法吧。建議參考,十分方便實用。

RGB24使用24位來表示一個像素,RGB分量都用8位表示,取值范圍為0-255。注意在內存中RGB各分量的排列順序為:BGR BGR BGR…。通常可以使用RGBTRIPLE數據結構來操作一個像素,它的定義為:
typedef struct tagRGBTRIPLE
{BYTE rgbtBlue; // 藍色分量
BYTE rgbtGreen; // 綠色分量
BYTE rgbtRed; // 紅色分量
} RGBTRIPLE;

⑻ c語言 用移位表達式表示一個數縮小或放大n倍

#include<stdio.h>
#define n 2

int main()
{
int data=0;
scanf("%d",&data);
data=data>>n; //縮小n倍褲跡高
data=data<<n; /胡尺州盯/放大n倍
}