我是硬件工程师,公司需要做一款SDK,被逼学习下MFC,现在需要一个功能,就是在指定路径下例如:C:\查找所有BMP文件,并将文件名叠加到图片中,保存为原文件名的BMP文件,谁能给个例程,或者指导一下,因为我是新手,而且是自学的,一点基础都没有,所以越详细越好,谢谢了。
解决方案 »
- 到底该怎么选择?MFC,WPF,c#?谁能告诉我?
- 关于GDI下浮点数坐标值系统的建立!!
- 一个线程对象的handle和它的id有什么区别?
- 有没有什么类,能得到网页中的返回值???急待解决,请帮忙!
- 关于typedef的用法的求教?(如果分不够,可另外给!)急!!!!!!!!!!!
- 显示内存中某段内存中的值,就像winhex一样
- 如何获得其它程序窗口的鼠标句柄?
- windows处理一个消息大约要多少时间?
- 高手请看......................
- 关于进度框所在的对话框中的文本框变空的问题,多谢!
- 怎样解决用来设置数据的编辑框不被UpdateData(FALSE)
- 用installshield 2011做的安装包 在安装过程中 出现network location 0 错误,该如何解决
说起来几句话,做起来代码比较长,但是并不是很难。
CDC MemDC;//定义一个DC
用MemDC.CreateCompatibleDC创建一个兼容DC。
用LoadImage将你的文件加载进来。HBitmap hBitmap=::LoadImage(NULL,"文件路径",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
用MemDC.SelObject将上面的hBitmap加载进DC中
第二步:
调用MemDC.TextOut将路径信息写进DC中。
第三步:
写文件,这个代码比较长,将一个hBitmap位图对象写进文件的代码你可以看这个:http://blog.csdn.net/wltg2001/archive/2008/04/17/2300258.aspx
*lpbi=bi;//将bi中的数据写入分配的内存中。
HDC hdc=::GetDC(NULL);
我在这设了断点,发现每次跑到这的时候都会报错。
Setting.exe 中的 0x005452f7 处未处理的异常: 0xC0000005: 写入位置 0x00000000 时发生访问冲突
请问可能是什么原因造成的呢?
========
这个不对,GetDC(NULL)取的是屏幕的DC啊,你应该用一个窗体的HWND作参数,或者不用GetDC,而用别的。
ByVal new_image_stream As Stream)
Dim i As Integer
Dim j As Integer
Dim c As Color
Dim bit_map As Bitmap
Dim new_bit_map As New Bitmap(new_image_stream)' Dim _image1 As Image ' = Image.FromFile("c:\my document\my picture\my.jpg")
' _image1 = Image.FromStream(image_stream)
' bit_map = New Bitmap(_image1) For i = 0 To 256 - 1
For j = 0 To 256 - 1 ' 注意下面两行代码
c = bit_map.GetPixel(i, j)
new_bit_map.SetPixel(i, j, c) Application.DoEvents()
Next
Next
' 下面一段没有经过调试,是大概意思,如果不急我再该你一个调试过的,或者你把问题说得再清楚一点我直接给你一个完整的代码。 new_bit_map.drawString("c:\my document\my pictures\my.jpg",font,x,y) End Sub
他说要自己开发一套SDK
肯定是要配合他的硬件使用的
这个帖子只是一个功能而已
i++;
和
++i;
搞混的人,调试程序总离不开书本,总是要去区分他俩的含义,不知你是否有此体会,也许你比我智商高没有这样的烦恼,现在好了使用vb或c#就不用老是身边有本书了。今天说了些多余的话,以后咱们(红猪)再调侃。熟悉一种语言不是一个程序员的本事,真正熟悉一个开发平台解决具体问题才是一个程序员的真正所在。
另:打一堆分号多烦啊!如果你使用vs2008开发平台的vb话,所有的封闭语句都由开发平台智能地自动封闭,这时你才感到一个程序员写程序有多么的舒服啊。
你们的软件工程师居然是女的
呵呵其实软件的东西说难也难
说简单也简单
不要太担心
有问题就过来问问吧
大家都会很热心的
wltg2001确实是好人
*lpbi=bi;
会提示:Setting.exe 中的 0x005a12c7 处最可能的异常: 0xC0000005: 写入位置 0x00000000 时发生访问冲突。
请问下怎么解决这?
一个save函数就搞定了
int CSettingDlg::OnDraw()
{ CDC MemDC;//
CString strpath;
CSettingApp *app=(CSettingApp *)AfxGetApp();
MemDC.CreateCompatibleDC(NULL);
strpath.Format( _T( "%s\\1206.bmp" ), app->BtcaPatha);
HBITMAP hBitmap=(HBITMAP)LoadImage( NULL,strpath,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
MemDC.SelectObject(hBitmap);
MemDC.TextOutW(20,20,strpath);
WORD wbitsCount;
DWORD dwpalettelsize=0;
DWORD dwbmdibitsize,dwdibsize,dwwritten;
BITMAP bitmap;
BITMAPFILEHEADER bmfhdr;
BITMAPINFOHEADER bi;
LPBITMAPINFOHEADER lpbi;
HANDLE fh,fdib;
GetObject(hBitmap,sizeof(BITMAP),(void *)&bitmap);
wbitsCount=bitmap.bmBitsPixel;
bi.biSize=sizeof(BITMAPINFOHEADER);
bi.biWidth=bitmap.bmWidth;
bi.biHeight=bitmap.bmHeight;
bi.biPlanes=1;
bi.biBitCount= bitmap.bmBitsPixel ;
bi.biClrImportant=0;
bi.biClrUsed=0;
bi.biCompression=BI_RGB;
bi.biSizeImage=0;
bi.biYPelsPerMeter=0;
bi.biXPelsPerMeter=0;
if(wbitsCount<=8)dwpalettelsize=(1<<wbitsCount)*sizeof(RGBQUAD);
dwbmdibitsize=((bitmap.bmWidth*wbitsCount+31)/8)*bitmap.bmHeight;
fdib=GlobalAlloc(GHND,dwbmdibitsize+dwpalettelsize+sizeof(BITMAPINFOHEADER));
lpbi=(LPBITMAPINFOHEADER)::GlobalLock(fdib);
*lpbi=bi;//将bi中的数据写入分配的内存中。
HDC hdc=::GetDC(NULL);
GetDIBits(hdc,hBitmap,0,(UINT)bitmap.bmHeight,(LPSTR)lpbi+sizeof(BITMAPINFOHEADER)+dwpalettelsize,(BITMAPINFO *)lpbi,DIB_RGB_COLORS);
fh=CreateFile(strpath,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_SEQUENTIAL_SCAN,NULL);
if(fh==INVALID_HANDLE_VALUE)
return false;
bmfhdr.bfType=0x4d42;
dwdibsize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+dwbmdibitsize+dwpalettelsize;
bmfhdr.bfSize=dwdibsize;
bmfhdr.bfReserved1=0;
bmfhdr.bfReserved2=0;
bmfhdr.bfOffBits=(DWORD)sizeof(BITMAPFILEHEADER)+(DWORD)sizeof(BITMAPINFOHEADER)+dwpalettelsize;
WriteFile(fh,(LPSTR)&bmfhdr,sizeof(BITMAPFILEHEADER),&dwwritten,NULL);
WriteFile(fh,(LPSTR)lpbi,dwdibsize,&dwwritten,NULL);
::GlobalUnlock(fdib);
::GlobalFree(fdib);
::CloseHandle(fh);
return TRUE;
}
所以我上面回帖的时候说你们这个情况其实应该包出去给别人做
呵呵
CImage很简单你上网搜搜就好了
至于你现在这个方法我想wltg2001看到了就会恢复你的
一会有时间我也会帮你看看
void CdfdffDlg::OnBnClickedButton1()
{
CDC MemDC;//
CString strpath;
//CSettingApp *app=(CSettingApp *)AfxGetApp();MemDC.CreateCompatibleDC(NULL);
//strpath.Format( _T( "%s\\1206.bmp" ), app->BtcaPatha);
HBITMAP hBitmap=(HBITMAP)LoadImage( NULL,"1.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
MemDC.SelectObject(hBitmap);
MemDC.TextOut(20,20,"1.bmp");
WORD wbitsCount;
DWORD dwpalettelsize=0;
DWORD dwbmdibitsize,dwdibsize,dwwritten;
BITMAP bitmap;
BITMAPFILEHEADER bmfhdr;
BITMAPINFOHEADER bi;
LPBITMAPINFOHEADER lpbi;
HANDLE fh,fdib;
GetObject(hBitmap,sizeof(BITMAP),(void *)&bitmap);
wbitsCount=bitmap.bmBitsPixel;
bi.biSize=sizeof(BITMAPINFOHEADER);
bi.biWidth=bitmap.bmWidth;
bi.biHeight=bitmap.bmHeight;
bi.biPlanes=1;
bi.biBitCount= bitmap.bmBitsPixel ;
bi.biClrImportant=0;
bi.biClrUsed=0;
bi.biCompression=BI_RGB;
bi.biSizeImage=0;
bi.biYPelsPerMeter=0;
bi.biXPelsPerMeter=0;
if(wbitsCount<=8)dwpalettelsize=(1<<wbitsCount)*sizeof(RGBQUAD);
dwbmdibitsize=((bitmap.bmWidth*wbitsCount+31)/8)*bitmap.bmHeight;
fdib=GlobalAlloc(GHND,dwbmdibitsize+dwpalettelsize+sizeof(BITMAPINFOHEADER));
lpbi=(LPBITMAPINFOHEADER)::GlobalLock(fdib);
*lpbi=bi;//将bi中的数据写入分配的内存中。
HDC hdc=::GetDC(NULL);
GetDIBits(hdc,hBitmap,0,(UINT)bitmap.bmHeight,(LPSTR)lpbi+sizeof(BITMAPINFOHEADER)+dwpalettelsize,(BITMAPINFO *)lpbi,DIB_RGB_COLORS);
fh=CreateFile("1.bmp",GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_SEQUENTIAL_SCAN,NULL);
if(fh==INVALID_HANDLE_VALUE)
return ;
bmfhdr.bfType=0x4d42;
dwdibsize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+dwbmdibitsize+dwpalettelsize;
bmfhdr.bfSize=dwdibsize;
bmfhdr.bfReserved1=0;
bmfhdr.bfReserved2=0;
bmfhdr.bfOffBits=(DWORD)sizeof(BITMAPFILEHEADER)+(DWORD)sizeof(BITMAPINFOHEADER)+dwpalettelsize;
WriteFile(fh,(LPSTR)&bmfhdr,sizeof(BITMAPFILEHEADER),&dwwritten,NULL);
WriteFile(fh,(LPSTR)lpbi,dwdibsize,&dwwritten,NULL);
::GlobalUnlock(fdib);
::GlobalFree(fdib);
::CloseHandle(fh);
return ;
}
如果实在不行,将工程发我邮箱吧,有时间我调一下。[email protected]
HBITMAP hBitmap=(HBITMAP)LoadImage( NULL,"1.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
会提示error C2664: “LoadImageW”: 不能将参数 2 从“const char [9]”转换为“LPCWSTR”
所以必须要用HBITMAP hBitmap=(HBITMAP)LoadImage( NULL,_T("1.bmp"),IMAGE_BITMAP,0,0,LR_LOADFROMFILE); 这种形式,是什么原因造成的呢?我在网上找别的例程的时候也经常遇到这种情况,别人跑的好好的程序,到我这就必须要改动。
你用的是默认的Unicode字符集
所以这里要做一个转换
具体的你不必太了解
我在执行完这句之后得到hBitmap的值是0x00000000,这个是不是不对?
就是提取C盘下的1206.bmp文件,这样写没问题吧?
我在执行完这句之后得到hBitmap的值是0x00000000,这个是不是不对?
==================
这个当然不对,说明LoadImage没有成功,很可能是文件路径的问题。
==================
写成:HBITMAP hBitmap=(HBITMAP)LoadImage( NULL,_T("C:\\1206.bmp")
之后还是不对,是不是因为我的BMP文件有问题?
我的BMP文件是通过JGP转的,用的是
fread(buf,1,200000,fp);
fwrite(buf,1,200000,fpp);
这两条命令生成的
你用photoshop另存为试试
fread(buf,1,200000,fp);
fwrite(buf,1,200000,fpp);
这两条命令生成的
=========
这两个能将JPG转成BMP?不可能的!用工具转吧!PS或是ACDSEE都可以。
void CSettingDlg::OnBnClickedBtnAdd()
{ CString strFileTitle;
CString strpath;
CFileFind finder;
char * a=new char[260];
TCHAR* buf = new TCHAR[1024*1024];
CSettingApp *app=(CSettingApp *)AfxGetApp();
strpath+=app->BtcaPatha;
strpath+="*.jpg";
BOOL bWorking = finder.FindFile (strpath);
while(bWorking)
{
bWorking=finder.FindNextFile();
strFileTitle=finder.GetFileTitle();
strpath=finder.GetFilePath();
FILE *fp = _tfsopen( strpath, _T( "rb" ), _SH_DENYNO );
fread(buf,1,200000,fp);
fclose(fp); strpath.Format( _T( "%s\\%s.bmp" ), app->BtcaPatha, strFileTitle);
FILE *fpp = _tfsopen( strpath, _T( "wb" ), _SH_DENYNO );
fwrite(buf,1,200000,fpp);
fclose(fpp);
int aa=OnDraw();
}
void CSettingDlg::OnBnClickedBtnAdd()
{ CString strFileTitle;
CString strpath;
CFileFind finder;
char * a=new char[260];
TCHAR* buf = new TCHAR[1024*1024];
CSettingApp *app=(CSettingApp *)AfxGetApp();
strpath+=app->BtcaPatha;
strpath+="*.jpg";
BOOL bWorking = finder.FindFile (strpath);
while(bWorking)
{
bWorking=finder.FindNextFile();
strFileTitle=finder.GetFileTitle();
strpath=finder.GetFilePath();
FILE *fp = _tfsopen( strpath, _T( "rb" ), _SH_DENYNO );
fread(buf,1,200000,fp);
fclose(fp); strpath.Format( _T( "%s\\%s.bmp" ), app->BtcaPatha, strFileTitle);
FILE *fpp = _tfsopen( strpath, _T( "wb" ), _SH_DENYNO );
fwrite(buf,1,200000,fpp);
fclose(fpp);
int aa=OnDraw();
}
这下难办了,还得找个把JPG转BMP的程序。
load
save
搞定
写个D盘的代码啊
CImage imgTransfer;
imgTransfer.Load(_T("D:\\1206.JPG"));
imgTransfer.Save(_T("D:\\1206.bmp"));
“CImage”: 未声明的标识符
这个我需要怎么办?
{
bWorking=finder.FindNextFile();
strFileTitle=finder.GetFileTitle();
strpath=finder.GetFilePath();
CImage imgTransfer;
imgTransfer.Load(strpath);
strpath.Format( _T( "%s\\%s.bmp" ), app->BtcaPatha, strFileTitle);
imgTransfer.Save(strpath);
CDC MemDC;
MemDC.CreateCompatibleDC(NULL);
HBITMAP hBitmap=(HBITMAP)LoadImage(NULL,strpath,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
MemDC.SelectObject(hBitmap);
MemDC.TextOutW(10,10,_T("123456789"));
WORD wbitsCount;
DWORD dwpalettelsize=0;
DWORD dwbmdibitsize,dwdibsize,dwwritten;
BITMAP bitmap;
BITMAPFILEHEADER bmfhdr;
BITMAPINFOHEADER bi;
LPBITMAPINFOHEADER lpbi;
HANDLE fh,fdib;
GetObject(hBitmap,sizeof(BITMAP),(void *)&bitmap);
wbitsCount=bitmap.bmBitsPixel;
bi.biSize=sizeof(BITMAPINFOHEADER);
bi.biWidth=bitmap.bmWidth;
bi.biHeight=bitmap.bmHeight;
bi.biPlanes=1;
bi.biBitCount= bitmap.bmBitsPixel ;
bi.biClrImportant=0;
bi.biClrUsed=0;
bi.biCompression=BI_RGB;
bi.biSizeImage=0;
bi.biYPelsPerMeter=0;
bi.biXPelsPerMeter=0;
if(wbitsCount<=8)dwpalettelsize=(1<<wbitsCount)*sizeof(RGBQUAD);
dwbmdibitsize=((bitmap.bmWidth*wbitsCount+31)/8)*bitmap.bmHeight;
fdib=GlobalAlloc(GHND,dwbmdibitsize+dwpalettelsize+sizeof(BITMAPINFOHEADER));
lpbi=(LPBITMAPINFOHEADER)::GlobalLock(fdib);
*lpbi=bi;//将bi中的数据写入分配的内存中。
HDC hdc=::GetDC(NULL);
GetDIBits(hdc,hBitmap,0,(UINT)bitmap.bmHeight,(LPSTR)lpbi+sizeof(BITMAPINFOHEADER)+dwpalettelsize,(BITMAPINFO *)lpbi,DIB_RGB_COLORS);
fh=CreateFile(strpath,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_SEQUENTIAL_SCAN,NULL);
if(fh==INVALID_HANDLE_VALUE)
bmfhdr.bfType=0x4d42;
dwdibsize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+dwbmdibitsize+dwpalettelsize;
bmfhdr.bfSize=dwdibsize;
bmfhdr.bfReserved1=0;
bmfhdr.bfReserved2=0;
bmfhdr.bfOffBits=(DWORD)sizeof(BITMAPFILEHEADER)+(DWORD)sizeof(BITMAPINFOHEADER)+dwpalettelsize;
WriteFile(fh,(LPSTR)&bmfhdr,sizeof(BITMAPFILEHEADER),&dwwritten,NULL);
WriteFile(fh,(LPSTR)lpbi,dwdibsize,&dwwritten,NULL);
::GlobalUnlock(fdib);
::GlobalFree(fdib);
::CloseHandle(fh); imgTransfer.Load(strpath);
strpath.Format( _T( "%s\\%s.jpg" ), app->BtcaPatha, strFileTitle);
imgTransfer.Save(strpath);
}
这是我新的代码基本是两位的集合,但是现在是把原来50多K的JPG变成了10多K,而且还没叠加上字符。
==========
CImage没用过,不发表意见了,但是你上面的代码应该还是有问题的,用CImage的方便之处就是保存文件时只用Save方法就行了,那上面我给的那么一大段代码就可以不用。
而且你用的方法本身就有问题
完全可以读出jpg
直接操作
然后再存回去
当然你具体的应用我们不了解
你仔细研究一下吧
如果直接对JPG叠加怎么处理啊?
CImage村jpg的指标比较低
具体怎么调整压缩比我也没有研究过
你开始说要把jpg转bmp我才推荐你使用的
如果你要存回jpg就要自己研究了
在源文件开头添加 #include "atlimage.h"