(毕业设计) 急急!!位图操作
我想做一个对位图操作的工程
1:从硬盘中读取位图文件
2:向位图文件写些文字 ,比如“I LOVE YOU!”
3: 保存修改后的位图文件,按原路径
各位大哥大姐,救救我吧!
初学vc,最好要有容易的代码
huxiaoyong1983@163.com
问题点数:0、回复次数:14Top
1 楼clife(笨狗API.NET)回复于 2004-05-05 06:07:15 得分 0
还是看看书吧,这个很简单啊.
读文件自己看看位图结构解析一下就可以了
要么就用LoadImage
写文字用TextOutTop
2 楼FengYuanMSFT((6.4 被封杀)袁峰 http://fengyuancom.spaces.live.com)回复于 2004-05-05 06:07:29 得分 0
Lots of code in http://safariexamples.informit.com/0130869856/Top
3 楼jsphuang(建设者)回复于 2004-05-05 09:36:55 得分 0
1.XP
2.vc6+GDI+(或者.NET);Top
4 楼swbreath(雪白呼嘘())回复于 2004-05-05 11:12:14 得分 0
1:LoadImage读取文件
2:创建内存DC,在内存DC上选择进入位图,然后再内存DC上TextOut
3:把位图替换下来,保存Top
5 楼wwwllg(野蛮人)回复于 2004-05-05 11:14:23 得分 0
1:LoadImage读取文件
2:创建内存DC,在内存DC上选择进入位图,然后再内存DC上TextOut
3:把位图替换下来,保存
----------------------------
和我想的一样。呵呵。
swbreath(雪白呼嘘) 觉得你vc是高手。Top
6 楼swbreath(雪白呼嘘())回复于 2004-05-05 11:19:55 得分 0
BOOL SaveBmp(HBITMAP hBitmap, CString FileName)
{
HDC hDC;
//当前分辨率下每象素所占字节数
int iBits;
//位图中每象素所占字节数
WORD wBitCount;
//定义调色板大小, 位图中像素字节大小 ,位图文件大小 , 写入文件字节数
DWORD dwPaletteSize=0, dwBmBitsSize=0, dwDIBSize=0, dwWritten=0;
//位图属性结构
BITMAP Bitmap;
//位图文件头结构
BITMAPFILEHEADER bmfHdr;
//位图信息头结构
BITMAPINFOHEADER bi;
//指向位图信息头结构
LPBITMAPINFOHEADER lpbi;
//定义文件,分配内存句柄,调色板句柄
HANDLE fh, hDib, hPal,hOldPal=NULL;
//计算位图文件每个像素所占字节数
hDC = CreateDC("DISPLAY", NULL, NULL, NULL);
iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES);
DeleteDC(hDC);
if (iBits <= 1) wBitCount = 1;
else if (iBits <= 4) wBitCount = 4;
else if (iBits <= 8) wBitCount = 8;
else wBitCount = 24;
GetObject(hBitmap, sizeof(Bitmap), (LPSTR)&Bitmap);
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = Bitmap.bmWidth;
bi.biHeight = Bitmap.bmHeight;
bi.biPlanes = 1;
bi.biBitCount = wBitCount;
bi.biCompression = BI_RGB;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrImportant = 0;
bi.biClrUsed = 0;
dwBmBitsSize = ((Bitmap.bmWidth * wBitCount + 31) / 32) * 4 * Bitmap.bmHeight;
//为位图内容分配内存
hDib = GlobalAlloc(GHND,dwBmBitsSize + dwPaletteSize + sizeof(BITMAPINFOHEADER));
lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);
*lpbi = bi;
// 处理调色板
hPal = GetStockObject(DEFAULT_PALETTE);
if (hPal)
{
hDC = ::GetDC(NULL);
hOldPal = ::SelectPalette(hDC, (HPALETTE)hPal, FALSE);
RealizePalette(hDC);
}
// 获取该调色板下新的像素值
GetDIBits(hDC, hBitmap, 0, (UINT) Bitmap.bmHeight, (LPSTR)lpbi + sizeof(BITMAPINFOHEADER)
+dwPaletteSize, (BITMAPINFO *)lpbi, DIB_RGB_COLORS);
//恢复调色板
if (hOldPal)
{
::SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);
RealizePalette(hDC);
::ReleaseDC(NULL, hDC);
}
//创建位图文件
fh = CreateFile(FileName, GENERIC_WRITE,0, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
if (fh == INVALID_HANDLE_VALUE) return FALSE;
// 设置位图文件头
bmfHdr.bfType = 0x4D42; // "BM"
dwDIBSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwPaletteSize + dwBmBitsSize;
bmfHdr.bfSize = dwDIBSize;
bmfHdr.bfReserved1 = 0;
bmfHdr.bfReserved2 = 0;
bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER) + dwPaletteSize;
// 写入位图文件头
WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);
// 写入位图文件其余内容
WriteFile(fh, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL);
//清除
GlobalUnlock(hDib);
GlobalFree(hDib);
CloseHandle(fh);
return TRUE;
}
上面是保存位图的,至于内存DC中替换位图的事情就非常好做了
首先创建一个设备兼容DC,然后创建一个设备兼容位图,然后把位图选择进入内存DC,然后再把图形绘制在内存DC上,然后再用旧的位图把这个选择进来的位图替换下来,然后再把位图保存为文件Top
7 楼swbreath(雪白呼嘘())回复于 2004-05-05 11:53:09 得分 0
回复人: wwwllg(wwwllg) ( )
________________________________________
hoho,俺还要努力……,我只会一些表面的东东Top
8 楼jia20003(『gloomy fish』兄弟们一个一个结婚刺激我想跳楼!)回复于 2004-05-05 13:33:13 得分 0
毕业设计做这个,简单了吧!Top
9 楼puhuofeie(扑火飞蛾)回复于 2004-05-05 20:31:15 得分 0
http://expert.csdn.net/Expert/topic/3018/3018876.xml?temp=7.497805E-02Top
10 楼bluebohe(薄荷)回复于 2004-05-06 11:53:12 得分 0
3:加载一个位图文件
HBITMAP hbitmap=(HBITMAP)LoadImage(0,strFileName,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_DEFAULTSIZE|LR_LOADFROMFILE);
Top
11 楼bluebohe(薄荷)回复于 2004-05-06 11:56:50 得分 0
CBitmap m_bmp;
CDC m_MemDC;
HBITMAP hbitmap=(HBITMAP)LoadImage(0,"g:\\tzg.bmp",IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_DEFAULTSIZE|LR_LOADFROMFILE);
m_MemDC.CreateCompatibleDC (NULL);
m_bmp.Attach(hbitmap);
CBitmap *pBitmap=(CBitmap *)m_MemDC.SelectObject(&m_bmp);
//m_MemDC.TextOut()……
m_MemDC.SelectObject(pBitmap);
SaveBmp(m_bmp,"E:\\tzg.bmp");
m_bmp.Detach();
m_MemDC.DeleteDC();
Top
12 楼bugzhao(阿辉)回复于 2004-05-06 12:44:51 得分 0
毕业设计。。。。Top
13 楼_foo(莫依[双双朵朵])回复于 2004-05-06 12:47:33 得分 0
http://www.vckbase.com/document/viewdoc/?id=1106Top
14 楼huxiaoyong1985(小小)回复于 2004-05-06 15:43:04 得分 0
谢谢了Top




