c语言生成bmp
int _tmain(int argc, _TCHAR* argv[])
{
FILE* pFileDat = fopen( "a.dat", "rb" );
FILE* pFileBmp = fopen( "b.bmp", "wb" );
int size = 0; char buf[1024] = {0};
if ( pFileBmp == NULL || pFileDat == NULL )
{
goto end;
}
while ( true )
{
size = fread( buf, 1, 1024, pFileDat );
if ( size == 0 )
{
break;
}
size = fwrite( buf, 1, size, pFileBmp );
if (size == 0)
{
break;
}
}
end:
if (pFileDat) fclose(pFileDat);
if (pFileBmp) fclose(pFileBmp);
return 0;
}
② 怎么用C语言读入、转存一个 BMP图片啊。。。
给你C++的代码吧呵呵,C的也差不多,稍微修改一下就行了
主要是你要了解BMP文件的结构,就是文件头那里所包含的信息,这里用了BITMAPINFOHEADER等现成的结构体来处理,BMP的文件头网络一下就知道的啦,很多资料
#include
"fstream.h"//24bit
bitmap
bool
CBitmapWindow::LoadFile
(char
*bmpFile)
{
FILE
*fp;
if((fp=fopen(bmpFile,"rb"))==NULL)
return
false;
WORD
bfType;
DWORD
bfSize;
WORD
bfReserved1;
WORD
bfReserved2;
DWORD
bfOffBits;
BITMAPINFOHEADER
bih;
fread(&bfType,sizeof(WORD),1,fp);
if(bfType!=0x4d42)
return
false;
fread(&bfSize,sizeof(DWORD),1,fp);
fread(&bfReserved1,sizeof(WORD),1,fp);
fread(&bfReserved2,sizeof(WORD),1,fp);
fread(&bfOffBits,sizeof(DWORD),1,fp);
fread(&bih,sizeof(BITMAPINFOHEADER1),1,fp);
nWidth=bih.biWidth
;
nHeight=bih.biHeight;
if(nWidth
%
4
!=0)
nWidth=nWidth+
(4-nWidth
%
4);
//修正位图宽度值
DWORD
size=nWidth*bih.biBitCount/8*nHeight;
arrayColor=new
ZafLogicalColor[nWidth*nHeight];
//
LPSTR
pData=new
char[size];
unsigned
char*
pData=new
unsigned
char[size];
fread(pData,size,1,fp);
int
bmWidthBytes=nWidth*bih.biBitCount
/8;
int
bmBitsPixel=bih.biBitCount
;
int
nBit=bmBitsPixel/8;
colorTableBitmap*
clrTableBmp;
clrTableBmp=new
colorTableBitmap[nWidth*nHeight];
char
cBit[40];
int
z;
for
(int
y=0;y<nHeight;y++)
{
for
(int
x=0;x<nWidth;x++)
{
z=nHeight-y-1;
clrTableBmp[y*nWidth+x].nIndex
=y*nWidth+x;
clrTableBmp[y*nWidth+x].iBlue
=pData[x*nBit+z*bmWidthBytes];
clrTableBmp[y*nWidth+x].iGreen
=pData[x*nBit+1+z*bmWidthBytes];
clrTableBmp[y*nWidth+x].iRed=pData[x*nBit+2+z*bmWidthBytes];
sprintf(cBit,",%d:%d:%d:%d",y*nWidth+x,pData[x*nBit+z*bmWidthBytes],
pData[x*nBit+1+z*bmWidthBytes],
pData[x*nBit+2+z*bmWidthBytes]);
}
}
delete
[]clrTableBmp;
delete
[]pData;
fclose(fp);
return
true;
}
③ 我想画几个函数图像用C语言生成到bmp之类的图片里去
Windows下的简单绘图肯定会首先考虑GDI或者GDI+,不过既然LZ都提到Linux了,那就发个平台无关的生成BMP正弦图的代码好了,这个就是最原始的手动生成BMP的代码,其实也不是很复杂。
---------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned long DWORD;
typedef long LONG;
#pragma pack(2)
typedef struct {
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER;
typedef struct {
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER;
void saveBitmap()
{
// Define BMP Size
const int height = 600;
const int width = 800;
const int size = height * width * 3;
double x, y;
int index;
// Part.1 Create Bitmap File Header
BITMAPFILEHEADER fileHeader;
fileHeader.bfType = 0x4D42;
fileHeader.bfReserved1 = 0;
fileHeader.bfReserved2 = 0;
fileHeader.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + size;
fileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
// Part.2 Create Bitmap Info Header
BITMAPINFOHEADER bitmapHeader = {0};
bitmapHeader.biSize = sizeof(BITMAPINFOHEADER);
bitmapHeader.biHeight = height;
bitmapHeader.biWidth = width;
bitmapHeader.biPlanes = 3;
bitmapHeader.biBitCount = 24;
bitmapHeader.biSizeImage = size;
bitmapHeader.biCompression = 0; //BI_RGB
// Part.3 Create Data
BYTE *bits = (BYTE *)malloc(size);
// Clear
memset(bits, 0xFF, size);
// Sin Graph
for(x = 0; x < 800; x += 0.5)
{
y = sin(x / 100.0) * 200 + 300;
index = (int)y * 800 * 3 + (int)x * 3;
bits[index + 0] = 255; // Blue
bits[index + 1] = 0; // Green
bits[index + 2] = 0; // Red
}
// Write to file
FILE *output = fopen("output.bmp", "wb");
if(output == NULL)
{
printf("Cannot open file!\n");
}
else
{
fwrite(&fileHeader, sizeof(BITMAPFILEHEADER), 1, output);
fwrite(&bitmapHeader, sizeof(BITMAPINFOHEADER), 1, output);
fwrite(bits, size, 1, output);
fclose(output);
}
}
int main()
{
saveBitmap();
return 0;
}
④ 如何用C语言在已有的bmp图片上添加文字生成新的图片
先要了解bmp结构吧,这个是最简单的图像数据结构。添加文字,就是要把要添加的地方的像素换成文字,即是把原来的地方的像素点成文字的像素,然后重新保存。如果知道,原图片的bmp以及文字的bmp图片,和在添加的地方坐标,就可以完成了。
⑤ 如何用C语言编程来显示一个bmp文件(要源码 最好有注释 谢谢)
c语言读bmp文件的话,需要你理解bmp文件格式,这个你可以自己去网络一下,我这里有个在vc中实现的源码。
#include<windows.h>
#include<stdio.h>
#include<string.h>
#include<malloc.h>
unsignedchar*pBmpBuf;//读入图像数据的指针
intbmpWidth;//图像的宽
intbmpHeight;//图像的高
RGBQUAD*pColorTable;//颜色表指针
intbiBitCount;//图像类型,每像素位数
boolreadBmp(char*bmpName)
{
//二进制读方式打开指定的图像文件
FILE*fp=fopen(bmpName,"rb");
if(fp==0)return0;
//跳过位图文件头结构BITMAPFILEHEADER
fseek(fp,sizeof(BITMAPFILEHEADER),0);
//定义位图信息头结构变量,读取位图信息头进内存,存放在变量head中
BITMAPINFOHEADERhead;
fread(&head,sizeof(BITMAPINFOHEADER),1,fp);
//获取图像宽、高、每像素所占位数等信息
bmpWidth=head.biWidth;
bmpHeight=head.biHeight;
biBitCount=head.biBitCount;
//定义变量,计算图像每行像素所占的字节数(必须是4的倍数)
intlineByte=(bmpWidth*biBitCount/8+3)/4*4;
//灰度图像有颜色表,且颜色表表项为256
if(biBitCount==8){
//申请颜色表所需要的空间,读颜色表进内存
pColorTable=newRGBQUAD[256];
fread(pColorTable,sizeof(RGBQUAD),256,fp);
}
//申请位图数据所需要的空间,读位图数据进内存
pBmpBuf=newunsignedchar[lineByte*bmpHeight];
fread(pBmpBuf,1,lineByte*bmpHeight,fp);
//关闭文件
fclose(fp);
return1;
}
boolsaveBmp(char*bmpName,unsignedchar*imgBuf,intwidth,intheight,
intbiBitCount,RGBQUAD*pColorTable)
{
//如果位图数据指针为0,则没有数据传入,函数返回
if(!imgBuf)
return0;
//颜色表大小,以字节为单位,灰度图像颜色表为1024字节,彩色图像颜色表大小为0
intcolorTablesize=0;
if(biBitCount==8)
colorTablesize=1024;
//待存储图像数据每行字节数为4的倍数
intlineByte=(width*biBitCount/8+3)/4*4;
//以二进制写的方式打开文件
FILE*fp=fopen(bmpName,"wb");
if(fp==0)return0;
//申请位图文件头结构变量,填写文件头信息
BITMAPFILEHEADERfileHead;
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);
//申请位图信息头结构变量,填写信息头信息
BITMAPINFOHEADERhead;
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);
return1;
}
intmain()
{
charinFileName[90],outFileName[90];
printf("请输入原始位图文件的文件名:");
scanf("%s",inFileName);
printf("请输入加密程序产生的新位图文件的文件名:");
scanf("%s",outFileName);
//读入指定BMP文件进内存
readBmp(inFileName);
//输出图像的信息
printf("width=%d,height=%d,biBitCount=%d ",bmpWidth,bmpHeight,biBitCount);
//将图像数据存盘
saveBmp(outFileName,pBmpBuf,bmpWidth,bmpHeight,biBitCount,pColorTable);
//清除缓冲区,pBmpBuf和pColorTable是全局变量,在文件读入时申请的空间
delete[]pBmpBuf;
if(biBitCount==8)
delete[]pColorTable;
return0;
}
⑥ 如何用C语言编程来显示一个bmp文件
BOOL BitBlt( HDC hdcDest, // 位图显示目标设备环境中 int nXDest, // 位图显示在客户区的x坐标 int nYDest, // 位图显示在客户区的y坐标 int nWidth, // 位图显示的宽度 int nHeight, // 位图显示的长度 HDC hdcSrc
⑦ 怎么样在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语言生成BMP图像问题
= =实话告诉你 这句话和生成BMP关系不大 只是为了产生某种灰度的花纹而已
fputc(c, fp); /* B */
fputc(c, fp); /* G */
fputc(c, fp); /* R */
这几行才是真正输出颜色的代码 你可以在每个fputc前面修改c的值以控制颜色
⑨ C语言编写程序显示bmp文件
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)
{
staticTCHARszAppName[]=TEXT("Bmp");
HWNDhwnd;
MSGmsg;
WNDCLASSwndclass;
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)
{
staticHBITMAPhBitmap;//位图句柄标示位图
staticintcxBitmap,cyBitmap;//位图的长宽
BITMAPbitmap;
HDChdc,hdcMem;
HINSTANCEhInstance;
PAINTSTRUCTps;
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);
}
最好在VC中编译
⑩ C语言中如何生成BMP格式图形文件麻烦告诉我
摘要:在科技论文和技术报告中,经常需要插入尽可能精确的各种黑白或彩色的图形和曲线,周而一般的绘图工具难以满足,尤其是通过复杂计算得到的结果更是如此。介绍了在科研人员广泛使用的C语言中,如何把黑白的或彩色的图文转换成BMP图形格式文件,从而顺利地插入用Word软件写的中文或英文报告中。