用vc 读取BMP图片并显示出来代码怎么写啊?
显示位图文件
HBITMAP hBitmap=(HBITMAP)LoadImage(NULL,_T(“xxx.bmp”),Image_Bitmap,0,0,
Lr_CreateDibSection|Lr_DefaultSize|Lr_LoadFromFile); //加载bmp文件
CBitmap bitmap;
bitmap.Attach(hBitmap); //关联位图对象
CDC dcimage;
dcimage.CreateCompatibleDC(pDC); //内存DC
BITMAP bmp;
bitmap.GetBitmap(&bmp); //获取位图信息
dcimage.SelectObject(&bitmap); //选取位图对象
pDC->BitBlt(0,0,bmp.bmWidth,bmp.bmHeight,&dcimage,0,0,SRCCOPY); //显示
这是单文档显示位图文件的方法,你照着看吧。
我有一个二维数组,我要新建一个BMP文件,将这个数组数据作为BMP位图的数据,怎么弄?有程序吗?
你需要了解BMP位图的文件格式:具体参阅百度百科: bmp 这个词条和MSDN。
我写了一个简单的创建24位BMP位图的小程序。 简单演示了bmp位图的格式。
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#define BMP_W 640L
#define BMP_H 480L
void SetBmpInfoHeader(PBITMAPINFOHEADER pbmpih)
{
/* 14~17: 本结构体所占字节数, 固定值40 */
pbmpih->biSize = 40;
/* 18~21: 位图的宽度(以像素pixel为单位) */
pbmpih->biWidth = BMP_W;
/* 22~25: 位图的高度 */
pbmpih->biHeight = BMP_H;
/* 26~27: 目标设备的级别, 固定值:1 */
pbmpih->biPlanes = 1;
/* 28~29: 一个像素所占bit数, 可以是:1(双色)、4(16色)、8(256色)
、16(65536色)、24(真彩色2^24种颜色)、32(真彩色2^32种颜色),具体参阅MSDN。
对于24位真彩色位图, 一个像素占用三个字节,即24 bits */
pbmpih->biBitCount = 24;
/* 30~33:指定是否压缩, (如果压缩了)采用的压缩格式。
可以为: BI_RGB、BI_RLE4、BI_RLE8、BI_BITFIELDS、BI_PNG、BI_JPEG
有的位图会进行游程长度编码:BI_RLE4、BI_RLE8
压缩可以节省空间, 但不便于编程读写。BI_RGB表示不进行压缩处理 */
pbmpih->biCompression = BI_RGB;
/* 34~37: 位图数据区所占字节数,有固定的计算公式 */
pbmpih->biSizeImage = ((((pbmpih->biWidth * pbmpih->biBitCount) + 31) & ~31) / 8) * pbmpih->biHeight;
/* 38~41: 位图水平分辨率,每米像素数 */
pbmpih->biXPelsPerMeter = 0L;
/* 42~45: 位图垂直分辨率,每米像素数 */
pbmpih->biYPelsPerMeter = 0L;
/* 46~49: 位图实际使用颜色表中颜色数(对于有调色板的位图来说实际上是调色板中颜色项数,
24位真彩色位图不需要调色板, 设为0, 8位灰度位图为256(2^8种颜色)。 */
pbmpih->biClrUsed = 0L;
/* 50~53: 显示位图所需颜色数 */
pbmpih->biClrImportant = 0L;
}
void SetBmpFileHeader(PBITMAPFILEHEADER pbmpfh, const PBITMAPINFOHEADER pbmpih)
{
/* 0~1: 固定值: “BM”(或0x4D42),即表明这是位图(一般以bmp为文件名后缀)*/
pbmpfh->bfType = *(WORD *)”BM”;
/* 2~5: 位图文件总大小(占用总字节数, 包括文件头、信息头、调色板、位图数据区占用字节数)*/
pbmpfh->bfSize = pbmpih->biSizeImage + 54 + pbmpih->biClrUsed * sizeof(RGBQUAD);
/* 6~7: 固定值0: 目前没什么用, 可能留作将来扩展。也有的结构体中有这样的域是为了内存对齐 */
pbmpfh->bfReserved1 = 0;
/* 8~9: 固定值 */
pbmpfh->bfReserved2 = 0;
/* 10~13: 位图数据区起始位置, 计算方法为:
位图文件头14个字节+位图信息头40个字节+位图调色板所占字节数,
这里要创建的是一张24位位图(无调色板),故设置为54 也可以。*/
pbmpfh->bfOffBits = 54 + pbmpih->biClrUsed * sizeof(RGBQUAD);
}
int main(void)
{
BITMAPFILEHEADER bmpfh = { 0 }; /* 位图文件头 */
BITMAPINFOHEADER bmpih = { 0 }; /* 位图信息头 */
FILE *fpBmp = NULL;
COLORREF color = RGB(0xf0,0xca,0xa6); /* 天蓝色 */
COLORREF black = 0;
int fillbits;
int w, h;
SetBmpInfoHeader(&bmpih);
SetBmpFileHeader(&bmpfh, &bmpih);
fillbits = ( 4 – ( bmpih.biWidth * 3 ) % 4 ) % 4;
fpBmp = fopen(“D:\\rendering.bmp”, “wb”);
if (NULL == fpBmp) {
perror(“fopen failed:”);
system(“pause>nul”);
exit(EXIT_FAILURE);
}
fwrite(&bmpfh, sizeof(BITMAPFILEHEADER), 1, fpBmp); /* 写入位图文件头 */
fwrite(&bmpih, sizeof(BITMAPINFOHEADER), 1, fpBmp); /* 写入位图信息头 */
/* 写入调色板(如果有的话) */
/* 写入位图数据 */
for (h = 0; h < BMP_H; ++h) {
for (w = 0; w < BMP_W; ++w) {
fwrite(&color, 3, 1, fpBmp); /* 将像素值颜色写入位图文件 */
}
/* 边界填充
对于24位位图每个像素占3个字节,且每个扫描行所占字节数必须是4的倍数。
比如,对于一张宽度为21个像素的24色位图, 理论上每扫描行占用21*3=63个字节,
但63不是4的倍数,所以需要在该扫描行的最后填充一个字节的0,凑到64,
这样实际上每扫描行占用64个字节。
fillbits = ( 4 – ( biheader.biWidth * 3 ) % 4 ) % 4; 参考自acepig, 作用是
计算每扫描行需要填充几个字节的0。对于宽度是4的倍数的图片, count为0。
*/
fwrite(&black, 1, fillbits, fpBmp);
}
fclose(fpBmp);
system(“mspaint D:\\rendering.bmp”);
return 0;
}
用VC怎样显示位图?
CClientDC dc(this);//取得客户区内存DC
CDC THDC;
HBITMAP THBM;
THDC.CreateCompatibleDC(0);//创建相关场景
THBM=(HBITMAP)LoadImage(NULL,”D:\\x.bmp”,IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);//载入位图
BITMAP bmp;
GetObject(THBM,sizeof(bmp),&bmp);//取得位图信息
SelectObject(THDC,THBM);//选入位图至内存DC
DeleteObject(THBM);//删除位图
BitBlt(dc,0,0,bmp.bmWidth,bmp.bmHeight,THDC,0,0,SRCCOPY);//将临时内存DC中的位图画到客户区中
//首先在D盘根目录下放一个标准.bmp格式的位图 再将这些代码写入一个按钮事件中 点击按键 就会在窗体的左上角看到图形了.
VC++优化截屏如何实现
两种方法。
第二种:参考一位网友的。
MFC中就有截取屏幕的相关函数:
ScrDC.CreateDC(“DISPLAY”, NULL, NULL, NULL);
具体函数如下:
//存储背景图片(成员变量)
CBitmap* m_pBackBitmap;
/*******************************
* 拷贝屏幕固定区域
* 参数:
* xStartPt – 拷贝屏幕的起始点X坐标
* yStartPt – 拷贝屏幕的起始点Y坐标
* width – 拷贝宽度
* height – 拷贝高度
* xToCopy – 拷贝目的地的起始点X坐标
* yToCopy – 拷贝目的地的起始点Y坐标
*******************************/
void CMyFun::CopyScreenToBitmap(xStartPt, yStartPt, width, height, xToCopy, yToCopy)
{
//NEW资源(调用一次重新拷贝一次)
if (m_pBackBitmap != NULL)
{
delete m_pBackBitmap;
m_pBackBitmap = NULL;
}
m_pBackBitmap = new CBitmap();
CDC ScrDC,MemDC;
ScrDC.CreateDC(“DISPLAY”, NULL, NULL, NULL);
MemDC.CreateCompatibleDC(&ScrDC);
m_pBackBitmap->CreateCompatibleBitmap(&ScrDC,width,height);
MemDC.SelectObject(m_pBackBitmap);
//开始拷贝
MemDC.BitBlt(xStartPt, yStartPt, width, height,&ScrDC,xToCopy,yToCopy,SRCCOPY);
ScrDC.DeleteDC();
MemDC.DeleteDC();
}
调用函数,实现截取全屏:
//取的屏幕分辨率
int width = ::GetSystemMetrics(SM_CXSCREEN);
int height = ::GetSystemMetrics(SM_CYSCREEN);
this->CopyScreenToBitmap(0,0,width,height,0,0);
//这时m_pBackBitmap指向的CBitmap对象就存着全屏的图象了
第一种:先截取屏幕保存为BMP格式文件,然后在VC资源中导入该位图。
CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP1); //IDB_BITMAP1为导入位图的ID。
CDC dc;
dc.CreateCompatibleDC(pDC); //创建兼容DC
dc.SelectObject(&bitmap); //选进设备表
BITMAP bmp;
bitmap.GetBitmap(&bmp);
CRect rect;
GetClientRect(&rect);
pDC->BitBlt(0,0,rect.Width(),rect.Height(),&dc,0,0,SRCCOPY); //注意参数SRCCOPY
VB图片的保存的问题
Option Explicit Private i As Long ‘窗体Form1 按钮Command1 Image1 Private Sub Command1_Click() SavePicture Image1.Picture, "C:\kkkk\" & CStr(i) & ".bmp" i = i + 1 End Sub Private Sub Form_Load() i = 1 Image1.Picture = LoadPicture("C:\kkkk\样品.jpg") End Sub
怎么在MFC编辑框中显示图片 求详解
首先你须要控件子类化,就是将控件对应的类派生出一个子类,然后用这个子类创建控件,在子类中添加WM_ERASEBKGND消息,对应的::OnEraseBkgnd函数中用兼容DC贴上准备好的图片,如下
BOOL XXXXXX::OnEraseBkgnd(CDC* pDC)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CRect rect;
GetClientRect(rect);//得到当前区域大小
CBitmap bitmap;
bitmap.LoadBitmapW(IDB_BITMAP1);//创建位图对象并附加位图
BITMAP bmp;
bitmap.GetBitmap(&bmp);//为了得到附加的位置的长宽
CDC CompatbleDC;
CompatbleDC.CreateCompatibleDC(pDC);//创建兼容DC
CompatbleDC.SelectObject(bitmap);//位图选入DC
pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&CompatbleDC,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);//将兼容dc贴到当前dc中并返回真,通知系统背景已经擦除成功
return TRUE
vc中判断图像是否对称
比如得到了图像句柄。hBitmap;(用CImage);
然后使用 :
BITMAP bmpinfo;
memset( &bmpinfo, 0, sizeof(bmpinfo) );
GetObject( hBitmap, sizeof(bmpinfo), &bmpinfo);
// 可以看看BITMAP结构成员描述信息。
// 判断对称
DWORD dwMask = 0x00FFFFFF; // 掩码要根据bmpinfo.bmBitsPixel 做个判断。自己做吧。
BYTE* pBuffer= ( BYTE*)bmpinfo.bmBits;
int nStepBytes= bmpinfo.bmBitsPixel/ 8;
int nWidCenter= bmpinfo.bmWidth/ 2;
for( int j = 0 ; j < bmpinfo.bmHeight; j++)
{
for( int i = 0 ; i < nWidCenter; i ++ )
{
DWORD dwLeft= *( ( DWORD*)( pBuffer+ i* nStepBytes);
DWORD dwRight= *( ( DWORD*)( pBuffer+ (bmpinfo.bmWidth-i)* nStepBytes);
// 修剪颜色值
dwLeft= dwLeft& dwMask;
dwRight= dwRight& dwMask;
if ( dwLeft!= dwRight)
return false; // 不对称,返回
}
pBuffer+= bmpinfo.bmWidthBytes;
}
return true;
以下几何题如何解答?
过B作BM⊥BP,且使BM=BP=2,连MP
∵MBA+ABP=ABP+PBC=90°
∴MBA=PBC
∵BM=PB,AB=BC
∴△MBA≌△PBC
∴BMA=BPC,AM=PC=4
BM=BP=2,MP=2√2,BMP=45°
由余弦定理 cosAMP=(PM^2+AM^2-AP^2)/2PM*AM=-3/4√2
∴sinAMP=√23/4√2
∴cosAMB=cos(AMP+45°)=√2cosAMP/2-√2sinAMP/2=(-3-√23)/8
∴cosCPB=cosAMB=(-3-√23)/8
CPB=arccos((-3-√23)/8)=π-arccos((3+√23)/8)
在MFC中如何获得一个CBitmap的宽和高?
直接用: BITMAP bmp; bmpIamge.GetBitmap(&bmp); int nWidth = bmp.bmWidth; int nHeight = bmp.bmHeight;
VB制作一个 一个按钮可以控制几张图片变换的编程
static i as integer picture1.picture=loadpicture("d:\" & i & ".bmp") i=i+1 也可加个判断这样就可以循环看图了 ‘if i=10 then i=0 ‘ 10为图的数量 ‘把d盘中的图片文件名改为从0~9假如有10张图) 0.bmp(或jpg) 1.bmp … 9.bmp