Ⅰ c語言怎麼處理圖片
想操作的,主要是操作像素點。根據矩陣位置可以做局部數據的調整
Ⅱ 用C語言調節照片的灰度,寫一段程序,謝謝
彩色圖到灰度圖的轉換
BOOL ColortoGrayScale(HWND hWnd)
{
DWORD SrcBufSize,DstBufSize,DstLineBytes;
LPBITMAPINFOHEADER lpImgData;
LPSTR lpPtr;
HLOCAL hTempImgData;
LPBITMAPINFOHEADER lpTempImgData;
LPSTR lpTempPtr;
HDC hDc;
HFILE hf;
LONG x,y;
BITMAPFILEHEADER DstBf;
BITMAPINFOHEADER DstBi;
LOGPALETTE *pPal;
HPALETTE hPrevPalette;
HLOCAL hPal;
DWORD NewNumColors;
WORD NewBitCount;
float Y;
DWORD i;
unsigned char Red,Green,Blue,Gray;
NewNumColors=NumColors; //NewNumColors為新圖的顏色數
NewBitCount=bi.biBitCount; //NewBitCount為新圖的顏色位數
if(NumColors==0) //真彩圖
{
NewNumColors=256;
NewBitCount=8;
}
//由於顏色位數有可能發生了改變,所以要重新計算每行佔用的位元組數以及新圖
//的緩沖區大小
DstLineBytes=(DWORD)WIDTHBYTES(bi.biWidth*NewBitCount);
DstBufSize=(DWORD)(sizeof(BITMAPINFOHEADER)+NewNumColors*
sizeof(RGBQUAD)+(DWORD)DstLineBytes*bi.biHeight);
//DstBf和DstBi為新的BITMAPFILEHEADER和BITMAPINFOHEADER
從點陣圖數據計算得到Y值,寫入新圖中
Gray=(BYTE)Y;
*(lpTempPtr++)=(unsigned char)Gray;
}
}
if(hBitmap!=NULL)
DeleteObject(hBitmap);
//產生新的點陣圖
hBitmap=CreateDIBitmap(hDc, (LPBITMAPINFOHEADER)lpTempImgData,
(LONG)CBM_INIT,
(LPSTR)lpTempImgData+sizeof(BITMAPINFOHEADER) +
NewNumColors*sizeof(RGBQUAD),
(LPBITMAPINFO)lpTempImgData, DIB_RGB_COLORS);
if(hPalette && hPrevPalette){
SelectPalette(hDc,hPrevPalette,FALSE);
RealizePalette(hDc);
}
hf=_lcreat("c:\\gray.bmp",0);
_lwrite(hf,(LPSTR)&DstBf,sizeof(BITMAPFILEHEADER));
_lwrite(hf,(LPSTR)lpTempImgData,DstBufSize);
_lclose(hf);
//釋放內存和資源
ReleaseDC(hWnd,hDc);
LocalUnlock(hTempImgData);
LocalFree(hTempImgData);
GlobalUnlock(hImgData);
return TRUE;
}
Ⅲ 如何用C語言在已有的bmp圖片上添加文字生成新的圖片
用C語言在已有的bmp圖片上添加文字生成新的圖片方法是:
1、首先要了解點陣圖文件的結構和熟悉C語言的畫圖函數等基層知識,這些知識可以在網上找到自學;
2、BMP(全稱Bitmap)是Windows操作系統中的標准圖像文件格式,可以分成兩類:設備相關點陣圖(DDB)和設備無關點陣圖(DIB),它採用位映射存儲格式,除了圖像深度可選以外,不採用其他任何壓縮,因此,BMP文件所佔用的空間很大,BMP文件存儲數據時,圖像的掃描方式是按從左到右、從下汪乎咐到上的順序,由於BMP文件格式是Windows環境中交換與圖有關的數據的一種標准,因此在Windows環境中運行的圖形圖像軟頃磨件都支持BMP圖像格式,圖像中每個像素的顏色值都保存在BMP文件中。
3、C語言是一種計算機程序設計語言,它既有高級語言的特點,又具有匯編語言的特點,它可以作為系統設計語言,編寫工作系統應用程序,也可以作為應用程序設計語言,編寫不依賴計算機硬體的應用程序,因此,它的應用范圍廣泛,
用C語言顯示BMP圖片,最直接的方法就是先將每個像素的顏色值提取出來困純,再用C語言的畫圖函數畫。
Ⅳ 用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語言實現)
這個還是比較復雜的。
輸入輸出都還比較簡單。
麻煩點在於
1 字型檔的讀取和解析。 這個可以使用開源的freetype庫。
從字型檔中,根據字型大小,以及文字的偏移量,得到點陣
2 根據點陣,生成圖片。 最簡單的就是bmp了
這個需要學習bmp的格式。 或者同樣使用開源庫