c語言bitmap
㈠ 如何用c語言(C++)讀取點陣圖的像素點RGB信息
pData裡面保存的就是一個一個的COLORREF結構,你只需要通過BITMAPINFOHEADER中的寬高等信息,計算位移,就可以讀取某個點的RGB值了。
還有一個簡單的辦法,你之前已經有memBitmap這個CBitmap了,通過這個做更方便。通過SelectObject將memBitmap放到一個CDC中,直接使用函數GetPixel函數就可以獲取指定某個點的RGB值了,這個不需要計算和位移。
㈡ 怎麼樣在c語言中顯示bmp圖片,我要完整正確的程序,急!
lz 你好
c語言要顯示bmp點陣圖需要使用win32的api , 具體如下:
BOOLBitBlt(
HDChdcDest,//點陣圖顯示目標設備環境中
intnXDest,//點陣圖顯示在客戶區的x坐標
intnYDest,//點陣圖顯示在客戶區的y坐標
intnWidth,//點陣圖顯示的寬度
intnHeight,//點陣圖顯示的長度
HDChdcSrc,//源設備環境(包含需要顯示的bmp點陣圖)
intnXSrc,//在當前點陣圖中顯示的開始x位置
intnYSrc,//在當前點陣圖中顯示的開始y位置
DWORDdwRop//映射模式
);
以下是源代碼:
//顯示bmp點陣圖
#include<windows.h>
#include"resource.h"
LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);
voidDrawBrick();
intWINAPIWinMain(HINSTANCEhInstance,
HINSTANCEhPrevInstance,
PSTRszCmdLine,
intiCmdShow)
{
static TCHAR szAppName[]=TEXT("Bmp");
HWND hwnd;
MSG msg;
WNDCLASS wndclass;
wndclass.style =CS_HREDRAW|CS_VREDRAW;
wndclass.lpfnWndProc =WndProc;
wndclass.cbClsExtra =0;
wndclass.cbWndExtra =0;
wndclass.hInstance =hInstance;
wndclass.hIcon =LoadIcon(NULL,IDI_APPLICATION);
wndclass.hCursor =LoadCursor(NULL,IDC_ARROW);
wndclass.hbrBackground =(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName =NULL;
wndclass.lpszClassName =szAppName;
if(!RegisterClass(&wndclass))
{
MessageBox(NULL,TEXT("ThisprogramrequiresWindowsNT!"),
szAppName,MB_ICONERROR);
return0;
}
hwnd=CreateWindow(szAppName,
TEXT("BmpDemo"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
754,
566,
NULL,
NULL,
hInstance,
NULL);
ShowWindow(hwnd,iCmdShow);
UpdateWindow(hwnd);
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
returnmsg.wParam;
}
LRESULTCALLBACKWndProc(HWNDhwnd,UINTmessage,WPARAMwParam,LPARAMlParam)
{
static HBITMAP hBitmap; //點陣圖句柄標示點陣圖
staticint cxBitmap,cyBitmap; //點陣圖的長寬
BITMAP bitmap;
HDC hdc,hdcMem;
HINSTANCE hInstance;
PAINTSTRUCT ps;
switch(message)
{
caseWM_CREATE:
hInstance=((LPCREATESTRUCT)lParam)->hInstance; //獲取窗口的實例句柄
hBitmap=LoadBitmap(hInstance,MAKEINTRESOURCE(IDB_BITMAP1)); //將點陣圖載入到內存中
GetObject(hBitmap,sizeof(BITMAP),&bitmap);
cxBitmap=bitmap.bmWidth;//獲取點陣圖的長
cyBitmap=bitmap.bmHeight;//獲取點陣圖的寬
return0;
caseWM_PAINT:
hdc=BeginPaint(hwnd,&ps);
hdcMem=CreateCompatibleDC(hdc);//創建一個兼容於hdc設備環境描述表的hdcMem主要是用於在內存中截圖
SelectObject(hdcMem,hBitmap);//將點陣圖選到hdcMem中
BitBlt(hdc,-1,-1,cxBitmap,cyBitmap,hdcMem,0,0,SRCCOPY);//繪制bmp點陣圖
DeleteDC(hdcMem);
EndPaint(hwnd,&ps);
return0;
caseWM_DESTROY:
DeleteObject(hBitmap);
PostQuitMessage(0);
return0;
}
returnDefWindowProc(hwnd,message,wParam,lParam);
}
程序運行效果:
㈢ c++中調用了GDI+畫圖,但是不知道怎麼釋放Bitmap資源
c++中調用了GDI+畫圖,但是不知道怎麼釋放Bitmap資源
1?C語言簡潔、緊湊,使用方便、靈活。ANSI C一共只有32個關鍵字:
auto break case char const continue default
do double else enum extern float for
goto if int long register return short
signed static sizof struct switch typedef union
unsigned void volatile while
9種控制語句,程序書寫自由,主要用小寫字母表示,壓縮了一切不必要的成分。
Turbo C擴充了11個關鍵字:
asm _cs _ds _es _ss cdecl far
huge interrupt near pascal
注意:在C語言中,關鍵字都是小寫的。
㈣ c語言讀取點陣圖編程
我也遇到過類似的問題,點陣圖數據讀取到內存,然後在保存的文件中。
新點陣圖文件,雖然能夠顯示但是圖片內容中存在大量錯誤。
後來發現問題的關鍵在於
fopen(bmpname,"rb");
注意rb標志,不管是只讀標志還是只寫標志,或者讀寫標志後面要加+。
也就是rb+
不加+的標志是針對的文本讀寫的。
加+的標志是針對二進制數據讀寫的。
而點陣圖文件是一種二進制數據。
㈤ 請教c語言大俠,將rgb圖片轉成二值圖,演算法怎麼處理,具體對像素存儲指針*bitmap_ptr 怎麼處理,感謝!
二值圖也是灰度圖,灰度是指單波段0-255
看看這個函數 wr_dat_only (bitmap_ptr[i+j]); 具體做了啥演算法。
㈥ C語言怎樣顯示一張圖片
1、如果有圖片(例如 wzzx.jpg) 程序中插一句:
system("mspaint wzzx.jpg"); 就可以 在運行時顯示這張圖片。
用字元串變數調用也可以:
char pic_name[80]="wzzx.jpg";
char cmd[100];
sprintf(cmd,"mspaint %s",pic_name);
system(cmd); // 顯示圖片
2、system函數:
原型:int system(const char * command);
功能:執行 dos(windows系統) 或 shell(Linux/Unix系統) 命令,參數字元串command為命令名;
說明:在windows系統中,system函數直接在控制台調用一個command命令。在Linux/Unix系統中,system函數會調用fork函數產生子進程,由子進程來執行command命令,命令執行完後隨即返回原調用的進程;
頭文件:stdlib.h;
返回值:命令執行成功返回0,執行失敗返回-1。
㈦ 用c語言編個程序,我想用 BitBlt 載入掩碼圖和點陣圖實現,讓活動的人物背景透明。
可以試試TransparentBlt 函數。
BOOL TransparentBlt(HDC hdcDest, int nXOriginDest, int nYOriginDest, int nWidthDest, int hHeightDest, HDC hdcSrc, int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc, UINT crTransparent);
crTransparent:源點陣圖中的RGB值當作透明顏色。
比如:人物圖片底色是黑色,用TransparentBlt函數blt圖片,參數crTransparent設為黑色RGB(0,0,0),就能完成透明拷貝。
㈧ 怎樣用C語言讀取一張圖片並進行簡單處理
圖片格式有很多種
bmp,
jpg,
gif,
png
等等
每種都有自己的格式。
處理圖片
一般流程
都是先讀取圖片文件,根據格式解析成點陣圖(bitmap)
然後對點陣圖進行處理。
所以
重點是解析。
這個是有很多的開源C庫的。
㈨ 對這個C語言程序很感興趣,但是不知道它的每個步驟是什麼意思,求大蝦解釋。
// 我只是簡單的看了一下,難免有錯,請見諒。希望能幫助您,如果有問題請回復。
// 祝你學習順利
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# include <malloc.h>
# include <ctype.h>
# include <process.h>
# include <windows.h>
// 上面這些是頭文件,include之後可以使用其中定義的函數和變數,比如Include <string.h>之後就可以使用string這個類了。
int bitmapToGray(char *OriginalBMP,char *ResultBMP); //聲明了一個函數將bitmap轉換為灰度圖像,括弧裡面的是輸入的變數。這個相當於告訴編譯器,後面會有一個函數叫這個名字,但沒有具體定義函數內容。
int main() // 這個main函數是整個程序的入口,進入入口之後,程序會調用bitmapToGray這個函數。
{
bitmapToGray("C:\\Users\\Sky\\Desktop\\LONGJIANG.bmp",
"C:\\Users\\Sky\\Desktop\\LONGJIANG2.bmp");
return 0;
}
int bitmapToGray(char *OriginalBMP,char *ResultBMP) // 這里是bitmapToGray函數的具體定義,相當於把這個函數具體做什麼一步一步寫出來。
{
unsigned char *BMP24Image,*BMP8Image;
BITMAPFILEHEADER fh;
BITMAPINFOHEADER ih;
RGBQUAD Color[256];
BYTE CTemp[3]; //顏色分量
int Row,Col,nCol;
int i,j,k;
FILE *f,*p;
//上面的都是聲明變數,這些變數的申請速度很快,因為他們在棧上,這個空間一般有1M,讀寫速度都比較快,使用起來安全。
BMP24Image=(unsigned char*)calloc(2000*2000,sizeof(unsigned char));
BMP8Image=(unsigned char*)calloc(1000*1000,sizeof(unsigned char));
//上面是申請空間,這個空間是在堆上面,這個堆基本就是內存,和虛擬內存了,很大,但是會比較慢,而且管理起來比較復雜。
if((f=fopen(OriginalBMP,"rb"))==NULL)
{
printf("open %s error,please check\n");
return 0;
}
fread(&fh,sizeof(BITMAPFILEHEADER),1,f);
if(fh.bfType!='MB')
{
printf("This is not a BMP picture\n");
return 0;
}
fh.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
+sizeof(RGBQUAD)*256;
fread(&ih,sizeof(BITMAPINFOHEADER),1,f);
Row=ih.biHeight;
Col=ih.biWidth;
Col=Col/4*4;
nCol=Col*4/4*4; //掃描寬度
ih.biBitCount=8; //改變像素位數大小,8位,256色
fread(BMP24Image,sizeof(unsigned char),Row*Col,f);
// 上面就是讀取BMP圖像
for(i=0;i<Row;i++)
{ for(j=0;j<Col;j++)
{
if(BMP24Image[i*Col+j]>128)
BMP8Image[i*Col+j]=255;
else BMP8Image[i*Col+j]=100;
// 上面是對BMP進行二值化處理
for(k=0;k<3;k++)
{
CTemp[k]=BMP24Image[i*nCol+j*3+k];
}
BMP8Image[i*Col+j]=CTemp[2]*0.299+CTemp[1]*0.587+CTemp[0]*0.114;//轉化公式
}
}
// 上面大概是空間轉換YUV到RGB
fclose(f);
if((p=fopen(ResultBMP,"wb"))==NULL)
{
printf("open savefile error\n");
return 0;
}
// 准備進行寫入操作
for(i=0;i<256;i++) //調色板
{
Color[i].rgbBlue=i;
Color[i].rgbGreen=i;
Color[i].rgbRed=i;
Color[i].rgbReserved=0;
}
// 灰度圖是從0~255,上面大概是進行灰度處理
fwrite(&fh,sizeof(BITMAPFILEHEADER),1,p);
fwrite(&ih,sizeof(BITMAPINFOHEADER),1,p);
fwrite(Color,sizeof(RGBQUAD),256,p);
fwrite(BMP8Image,sizeof(unsigned char),Row*Col,p);
fclose(p);
// 上面進行寫入操作,並且關閉
return 0;
}
㈩ 請教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;
}
這只是最基本的打開圖片文件,跟打開普通文件沒什麼區別,後面要對圖片進行處理的話沒有圖形學的知識會很困難,如果想進一步研究,建議學習一下計算機圖形學