本文目錄一覽:
C語言編寫程序顯示bmp文件
BOOL BitBlt(
HDC hdcDest, // 點陣圖顯示目標設備環境中
int nXDest, // 點陣圖顯示在客戶區的x坐標
int nYDest, // 點陣圖顯示在客戶區的y坐標
int nWidth, // 點陣圖顯示的寬度
int nHeight, // 點陣圖顯示的長度
HDC hdcSrc, // 源設備環境(包含需要顯示的bmp點陣圖)
int nXSrc, // 在當前點陣圖中顯示的開始x位置
int nYSrc, // 在當前點陣圖中顯示的開始y位置
DWORD dwRop // 映射模式
);
//顯示bmp點陣圖
#includewindows.h
#include”resource.h”
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
void DrawBrick();
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
PSTR szCmdLine,
int iCmdShow)
{
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(“This program requires Windows NT!”),
szAppName, MB_ICONERROR);
return 0;
}
hwnd = CreateWindow(szAppName,
TEXT(“Bmp Demo”),
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);
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static HBITMAP hBitmap; //點陣圖句柄 標示點陣圖
static int cxBitmap, cyBitmap; //點陣圖的長寬
BITMAP bitmap;
HDC hdc, hdcMem;
HINSTANCE hInstance;
PAINTSTRUCT ps;
switch(message)
{
case WM_CREATE:
hInstance = ((LPCREATESTRUCT)lParam)-hInstance; //獲取窗口的實例句柄
hBitmap = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP1)); //將點陣圖載入到內存中
GetObject(hBitmap, sizeof(BITMAP), bitmap);
cxBitmap = bitmap.bmWidth;//獲取點陣圖的長
cyBitmap = bitmap.bmHeight;//獲取點陣圖的寬
return 0 ;
case WM_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);
return 0;
case WM_DESTROY:
DeleteObject(hBitmap);
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}
最好在VC中編譯
如何用C語言編程來顯示一個bmp文件
直接上代碼吧:
#include Windows.h
#include stdio.h
#include string.h
#include malloc.h
unsigned char *pBmpBuf;//讀入圖像數據的指針
int bmpWidth;//圖像的寬
int bmpHeight;//圖像的高
RGBQUAD *pColorTable;//顏色表指針
int biBitCount;//圖像類型,每像素位數
bool readBmp(char *bmpName)
{
//二進位讀方式打開指定的圖像文件
FILE *fp=fopen(bmpName,”rb”);
if(fp==0) return 0;
//跳過點陣圖文件頭結構BITMAPFILEHEADER
fseek(fp, sizeof(BITMAPFILEHEADER),0);
//定義點陣圖信息頭結構變數,讀取點陣圖信息頭進內存,存放在變數head中
BITMAPINFOHEADER head;
fread(head, sizeof(BITMAPINFOHEADER), 1,fp);
//獲取圖像寬、高、每像素所佔位數等信息
bmpWidth = head.biWidth;
bmpHeight = head.biHeight;
biBitCount = head.biBitCount;
//定義變數,計算圖像每行像素所佔的位元組數(必須是4的倍數)
int lineByte=(bmpWidth * biBitCount/8+3)/4*4;
//灰度圖像有顏色表,且顏色表表項為256
if(biBitCount==8){
//申請顏色表所需要的空間,讀顏色表進內存
pColorTable=new RGBQUAD[256];
fread(pColorTable,sizeof(RGBQUAD),256,fp);
}
//申請點陣圖數據所需要的空間,讀點陣圖數據進內存
pBmpBuf=new unsigned char[lineByte * bmpHeight];
fread(pBmpBuf,1,lineByte * bmpHeight,fp);
//關閉文件
fclose(fp);
return 1;
}
bool saveBmp(char *bmpName, unsigned char *imgBuf, int width, int height,
int biBitCount, RGBQUAD *pColorTable)
{
//如果點陣圖數據指針為0,則沒有數據傳入,函數返回
if(!imgBuf)
return 0;
//顏色表大小,以位元組為單位,灰度圖像顏色表為1024位元組,彩色圖像顏色表大小為0
int colorTablesize=0;
if(biBitCount==8)
colorTablesize=1024;
//待存儲圖像數據每行位元組數為4的倍數
int lineByte=(width * biBitCount/8+3)/4*4;
//以二進位寫的方式打開文件
FILE *fp=fopen(bmpName,”wb”);
if(fp==0) return 0;
//申請點陣圖文件頭結構變數,填寫文件頭信息
BITMAPFILEHEADER fileHead;
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);
//申請點陣圖信息頭結構變數,填寫信息頭信息
BITMAPINFOHEADER head;
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);
return 1;
}
int main()
{
char inFileName[90],outFileName[90];
printf(“請輸入原始點陣圖文件的文件名:”);
scanf(“%s”,inFileName);
printf(“請輸入加密程序產生的新點陣圖文件的文件名:”);
scanf(“%s”,outFileName);
//讀入指定BMP文件進內存
readBmp(inFileName);
//輸出圖像的信息
printf(“width=%d,height=%d, biBitCount=%d\n”,bmpWidth,bmpHeight, biBitCount);
//將圖像數據存檔
saveBmp(outFileName, pBmpBuf, bmpWidth, bmpHeight, biBitCount, pColorTable);
//清除緩衝區,pBmpBuf和pColorTable是全局變數,在文件讀入時申請的空間
delete []pBmpBuf;
if(biBitCount==8)
delete []pColorTable;
return 0;
}
如何用C語言在已有的bmp圖片上添加文字生成新的圖片?
用C語言在已有的bmp圖片上添加文字生成新的圖片方法是:
1、首先要了解點陣圖文件的結構和熟悉C語言的畫圖函數等基層知識,這些知識可以在網上找到自學;
2、BMP(全稱Bitmap)是Windows操作系統中的標準圖像文件格式,可以分成兩類:設備相關點陣圖(DDB)和設備無關點陣圖(DIB),它採用位映射存儲格式,除了圖像深度可選以外,不採用其他任何壓縮,因此,BMP文件所佔用的空間很大,BMP文件存儲數據時,圖像的掃描方式是按從左到右、從下到上的順序,由於BMP文件格式是Windows環境中交換與圖有關的數據的一種標準,因此在Windows環境中運行的圖形圖像軟體都支持BMP圖像格式,圖像中每個像素的顏色值都保存在BMP文件中。
3、C語言是一種計算機程序設計語言,它既有高級語言的特點,又具有彙編語言的特點,它可以作為系統設計語言,編寫工作系統應用程序,也可以作為應用程序設計語言,編寫不依賴計算機硬體的應用程序,因此,它的應用範圍廣泛,
用C語言顯示BMP圖片,最直接的方法就是先將每個像素的顏色值提取出來,再用C語言的畫圖函數畫。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/258159.html