当前位置:首页 » 编程语言 » 用c语言写照片
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

用c语言写照片

发布时间: 2023-08-15 17:06:40

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的格式。 或者同样使用开源库