现已获得各个像素点的坐标和灰度值,如何用VC++绘制位图
3个回答
展开全部
嗯 ~~是这样的,。
1:你知道每个像素的坐标和灰度,那就知道图像的大小,定义一个固定的二维数组,把所有像素存入其中。
color ColorBuffer[WIDTH][HEIGHT] = {0};
ColorBuffer[i][j].b = ColorBuffer[i][j].g = ColorBuffer[i][j].r = colorzhi1//当前像素值,如果RGB一样。如果不一样则单独赋值;
2: 然后SaveBmp((LPSTR)(LPCTSTR)bmpname, WIDTH,HEIGHT, (unsigned char*)ColorBuffer);
把ColorBuffer中的值转化成BMP
//bmpname.Format("E:\\8位图像%d.bmp",1);
3:保存还是直接显示就看你自己了
参考SaveBmp函数: 这是vc9下的,UNC字符集的。
void CSeekerDataDlg::SaveBmp(char *filename,int height,int width,unsigned char *data)
// 函数名 文件名指针 文件高度 文件宽度 文件数据指针
{
unsigned int size = width * height * 3 + 54;
struct BMPPIC
{
BITMAPFILEHEADER bitmapfileheader;
BITMAPINFOHEADER bitmapinfoheader;
}bitmap;
//写bmp文件信息头
bitmap.bitmapinfoheader.biSize = sizeof(BITMAPINFOHEADER);
bitmap.bitmapinfoheader.biWidth = width;
bitmap.bitmapinfoheader.biHeight = height;
bitmap.bitmapinfoheader.biPlanes = 1;
bitmap.bitmapinfoheader.biBitCount = 24; //24位
bitmap.bitmapinfoheader.biCompression = 0;
bitmap.bitmapinfoheader.biSizeImage = width*width*3;
bitmap.bitmapinfoheader.biXPelsPerMeter = 0;
bitmap.bitmapinfoheader.biYPelsPerMeter = 0;
bitmap.bitmapinfoheader.biClrUsed = 256;
bitmap.bitmapinfoheader.biClrImportant = 256;
//写文件头
bitmap.bitmapfileheader.bfType = 0x4D42; // 位图文件的类型,必须为BM
bitmap.bitmapfileheader.bfSize = (DWORD)sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+ height*width*3; //位图文件的大小,以字节为单位
bitmap.bitmapfileheader.bfReserved1 = 0; // 位图文件保留字,必须为0
bitmap.bitmapfileheader.bfReserved2 = 0; // 位图文件保留字,必须为0
bitmap.bitmapfileheader.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER); // 位图数据的起始位置,以相对于位图 // 文件头的偏移量表示,以字节为单位
int totaldLine=height;
int totalArray=width;
int lpitch=bitmap.bitmapinfoheader.biSizeImage/bitmap.bitmapinfoheader.biHeight;
int ipitch=bitmap.bitmapinfoheader.biWidth*(bitmap.bitmapinfoheader.biBitCount/8);
//bitmap.buffer=(UCHAR*)malloc(bitmap.bitmapinfoheader.biSizeImage);
//HANDLE fh;
// fh = CreateFile(filename, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
FILE* fp = fopen(filename, "wb");
if (!fp) return;
fwrite((LPSTR)&bitmap.bitmapfileheader, 1, sizeof(bitmap.bitmapfileheader), fp);
fwrite((LPSTR)&bitmap.bitmapinfoheader, 1,sizeof(bitmap.bitmapinfoheader),fp);
fwrite(data, 1, size,fp); fclose(fp);
}
1:你知道每个像素的坐标和灰度,那就知道图像的大小,定义一个固定的二维数组,把所有像素存入其中。
color ColorBuffer[WIDTH][HEIGHT] = {0};
ColorBuffer[i][j].b = ColorBuffer[i][j].g = ColorBuffer[i][j].r = colorzhi1//当前像素值,如果RGB一样。如果不一样则单独赋值;
2: 然后SaveBmp((LPSTR)(LPCTSTR)bmpname, WIDTH,HEIGHT, (unsigned char*)ColorBuffer);
把ColorBuffer中的值转化成BMP
//bmpname.Format("E:\\8位图像%d.bmp",1);
3:保存还是直接显示就看你自己了
参考SaveBmp函数: 这是vc9下的,UNC字符集的。
void CSeekerDataDlg::SaveBmp(char *filename,int height,int width,unsigned char *data)
// 函数名 文件名指针 文件高度 文件宽度 文件数据指针
{
unsigned int size = width * height * 3 + 54;
struct BMPPIC
{
BITMAPFILEHEADER bitmapfileheader;
BITMAPINFOHEADER bitmapinfoheader;
}bitmap;
//写bmp文件信息头
bitmap.bitmapinfoheader.biSize = sizeof(BITMAPINFOHEADER);
bitmap.bitmapinfoheader.biWidth = width;
bitmap.bitmapinfoheader.biHeight = height;
bitmap.bitmapinfoheader.biPlanes = 1;
bitmap.bitmapinfoheader.biBitCount = 24; //24位
bitmap.bitmapinfoheader.biCompression = 0;
bitmap.bitmapinfoheader.biSizeImage = width*width*3;
bitmap.bitmapinfoheader.biXPelsPerMeter = 0;
bitmap.bitmapinfoheader.biYPelsPerMeter = 0;
bitmap.bitmapinfoheader.biClrUsed = 256;
bitmap.bitmapinfoheader.biClrImportant = 256;
//写文件头
bitmap.bitmapfileheader.bfType = 0x4D42; // 位图文件的类型,必须为BM
bitmap.bitmapfileheader.bfSize = (DWORD)sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+ height*width*3; //位图文件的大小,以字节为单位
bitmap.bitmapfileheader.bfReserved1 = 0; // 位图文件保留字,必须为0
bitmap.bitmapfileheader.bfReserved2 = 0; // 位图文件保留字,必须为0
bitmap.bitmapfileheader.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER); // 位图数据的起始位置,以相对于位图 // 文件头的偏移量表示,以字节为单位
int totaldLine=height;
int totalArray=width;
int lpitch=bitmap.bitmapinfoheader.biSizeImage/bitmap.bitmapinfoheader.biHeight;
int ipitch=bitmap.bitmapinfoheader.biWidth*(bitmap.bitmapinfoheader.biBitCount/8);
//bitmap.buffer=(UCHAR*)malloc(bitmap.bitmapinfoheader.biSizeImage);
//HANDLE fh;
// fh = CreateFile(filename, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
FILE* fp = fopen(filename, "wb");
if (!fp) return;
fwrite((LPSTR)&bitmap.bitmapfileheader, 1, sizeof(bitmap.bitmapfileheader), fp);
fwrite((LPSTR)&bitmap.bitmapinfoheader, 1,sizeof(bitmap.bitmapinfoheader),fp);
fwrite(data, 1, size,fp); fclose(fp);
}
东莞大凡
2024-08-07 广告
2024-08-07 广告
OpenCV标定板是东莞市大凡光学科技有限公司在相机标定中常用的工具。它通常由黑白格点按一定规则排列在平面上组成,如棋盘格或圆形格等。在相机标定时,将标定板置于不同位置和姿态下拍摄图像,利用OpenCV库中的函数检测标定板上的角点或圆心,进...
点击进入详情页
本回答由东莞大凡提供
展开全部
HBITMAP人骨形态发生蛋白=(HBITMAP)的LoadImage(NULL,“Z:\ \ bg4.bmp”,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION | LR_LOADFROMFILE);
(hBmp! = NULL)
{
> BMP位图= {0};
沤= GETOBJECT(人骨形态发生蛋白,大小(位图),BMP);
(RET)
{
TRACE(“宽度= %d的高度=%2 =%bitsperpixel计算e\ N“bmp.bmWidth,bmp.bmHeight,bmp.bmBitsPixel);
BYTE * pPixel =(BYTE *)bmp.bmBits; / /点BMP像素指针
诠释x = 1439,Y = 899,/ /指定要获得指定像素的图片左上角的坐标坐标0,0
BYTE * pOffset = pPixel +(bmp.bmHeight - 1)* bmp.bmWidthBytes; / /点到最后一行的像素数据
Poffset =(Poffset - Y * bmp.bmWidthBytes)+ X * bmp.bmBitsPixel / 8; / /点到指定的像素位置
DWORD RGB = 0;
的memcpy(RGB,Poffset,bmp.bmBitsPixel / 8);
TRACE(“(X =%DY =%D)=%U \”,X,Y,RGB);
}
> DeleteObject的(人骨形态发生蛋白);
人骨形态发生蛋白= NULL;
ZeroMemory(&BMP,sizeof(BMP)的);在
}
上面的代码是你想要的RGB像素
a>
如果您处理的情况下在对话框中,可以用类似下面的代码实现
CDC * pDC的=的GetDC();
点PT; BR /> pt.x = 10;:
PT。 Y = 10;
PDC-> setPixel(PT,RGB(255,0,0));
(hBmp! = NULL)
{
> BMP位图= {0};
沤= GETOBJECT(人骨形态发生蛋白,大小(位图),BMP);
(RET)
{
TRACE(“宽度= %d的高度=%2 =%bitsperpixel计算e\ N“bmp.bmWidth,bmp.bmHeight,bmp.bmBitsPixel);
BYTE * pPixel =(BYTE *)bmp.bmBits; / /点BMP像素指针
诠释x = 1439,Y = 899,/ /指定要获得指定像素的图片左上角的坐标坐标0,0
BYTE * pOffset = pPixel +(bmp.bmHeight - 1)* bmp.bmWidthBytes; / /点到最后一行的像素数据
Poffset =(Poffset - Y * bmp.bmWidthBytes)+ X * bmp.bmBitsPixel / 8; / /点到指定的像素位置
DWORD RGB = 0;
的memcpy(RGB,Poffset,bmp.bmBitsPixel / 8);
TRACE(“(X =%DY =%D)=%U \”,X,Y,RGB);
}
> DeleteObject的(人骨形态发生蛋白);
人骨形态发生蛋白= NULL;
ZeroMemory(&BMP,sizeof(BMP)的);在
}
上面的代码是你想要的RGB像素
a>
如果您处理的情况下在对话框中,可以用类似下面的代码实现
CDC * pDC的=的GetDC();
点PT; BR /> pt.x = 10;:
PT。 Y = 10;
PDC-> setPixel(PT,RGB(255,0,0));
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
pDC->SetPixel
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询