本文目錄一覽:
用C語言讀取16位bmp圖片的每個像素的信息~
沒有什麼不同。
讀出 BITMAPINFO 結構:
typedef struct tagBITMAPINFO {
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[1];
} BITMAPINFO;
以後,
BITMAPINFOHEADER 結構 里就有 biBitCount
biBitCount 等於 16 就是16位,等於24 就是24位,等於32 就是32位。
顏色在哪,要考慮 biCompression 壓縮方法,若等於 BI_RGB, bmiColors 就等於 NULL. 在 bitmap 數組裡 每個WORD 就是 一個像素點. 5個 bits 蘭,5個 bits 綠,再5個 bits 紅,最高位不用。
其它方法自己看資料吧。
C語言的枚舉求解的循環問題
因為你的if(bc){t=b;b=c;c=t;}一句把b、c的值交換了,導致不斷循環。在for循環中不要變動循環計數器的值,這會導致結構混亂。在某些編譯器里如果在for循環內改動循環計數器的值會直接報錯。
如果你想避免重複,有兩種方法,其一是c直接從b開始循環;其二是可以將每一對結果保存在一個Bitmap數組中,將已知的數對的flag置為1,得到一組新結果時,首先判斷這兩個數在Bitmap中的flag是否為1,如果均為1說明這是一個已知解,拋棄該解;否則說明這是一個新解,那麼將該解寫入Bitmap中並且輸出到屏幕上。
另外你這個演算法的冗餘太多,可以進行大量剪枝以優化性能。
利用導數可以證明當a,b∈N*時,(ab-1)’≥(a+b)’,∴當(ab-1)/(b+c)x時,應該直接拋棄其後的所有a、b值。為了避免重複解,b的值應該從a開始循環。這樣可以節省大量無用的CPU時間。修改後的代碼如下:
#includestdio.h
int main()
{
int b,c,x,t;
float a;
scanf(“%d”,x);
for(b=0;b=60000;b++)
for(c=b;c=60000;c++)
if(b!=0||c!=0)
{
a=(b*c-1)*1.0/(b+c);
if(ax) break;
if(a==x) printf(“%d\n%d\n”,b,c);
}
return 0;
}
輸入100時,對比修改前後代碼,一個用時31s,一個用時1s,時間節省了96%,可見優化效果多麼巨大。
關於C語言處理圖像的問題
#include Bitmap.h//引用處理圖片的頭文件
FILE *hFile = NULL;//文件指針
int LoadBitmapFile ( char *fileName, BITMAP_IMAGE_PTR bitmap )
{
int hImageFile = 0; //文件讀取成功的標識
unsigned char *workingBuffer = 0; //保存讀取的圖片
hImageFile = _open ( fileName, _O_RDONLY ); //以只讀方式打開圖片文件,成功返回1,失敗返回-1
if ( hImageFile==-1 )//如果打開失敗,則輸出警告
{
WriteLogFile ( “LoadBitmapFile function error! \nCan not open the bitmap.\n” );
return 0;
}
這只是最基本的打開圖片文件,跟打開普通文件沒什麼區別,後面要對圖片進行處理的話沒有圖形學的知識會很困難,如果想進一步研究,建議學習一下計算機圖形學
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/303261.html