现已获得各个像素点的坐标和灰度值,如何用VC++绘制位图

2024-11-06 00:49:24
推荐回答(3个)
回答1:

嗯 ~~是这样的,。
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);
}

回答2:

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));

回答3:

pDC->SetPixel