我在Vc6.0下使用GDI+ 来显示,改变各种形式的图片(主要是BMP,JPEG)都实现了,可是为什么保存功能就不能实现呢执行这句话不成功
int k = m_pImage.Save(A2CW(picname),&pngClsid,NULL);结果返回 k=10,错误类型是
FileNotFound :Indicates that the specified image file or metafile cannot be found.
可是图片能显示出来,图片文件没有找到是什么意思呢,picname 是我指定的存放图片的路径名 ,m_pImage是Image类型的变量各位大侠帮忙看看吧
我还有个问题就是:因为我是基于对话框的程序,我是在CMyStatic控件上显示图片,(CMyStatic 是从CStatic派生而来),对话框最小化以后再打开图片就不见了,我在CMyStatic的OnPaint里重新用显示图片结果就会占用大量的CUP导致程序无法正常运行下去,这是怎么回事呢
int k = m_pImage.Save(A2CW(picname),&pngClsid,NULL);结果返回 k=10,错误类型是
FileNotFound :Indicates that the specified image file or metafile cannot be found.
可是图片能显示出来,图片文件没有找到是什么意思呢,picname 是我指定的存放图片的路径名 ,m_pImage是Image类型的变量各位大侠帮忙看看吧
我还有个问题就是:因为我是基于对话框的程序,我是在CMyStatic控件上显示图片,(CMyStatic 是从CStatic派生而来),对话框最小化以后再打开图片就不见了,我在CMyStatic的OnPaint里重新用显示图片结果就会占用大量的CUP导致程序无法正常运行下去,这是怎么回事呢
解决方案 »
- 请问这几个小问题怎么解决呢?
- 在程序中如何调用SQL事务
- 通讯协议中的TCP报文头中的CRC校验位是什么样的?
- GfxOutBarCtrl
- 请教一下 CWnd::Create的问题!
- 隐式链接exe用到lib和dll的时候,区分debug/release吗?
- 客户端send的不能连续发
- 有关ACTIVEX和OPENGL编程??急!!!
- 为什么SetGraphicsMode为GM_ADVNACE会失败?
- 如何将客户区作为位图拷贝到打印DC出打印出来?
- 关于 FindWindow 我只知道 它的名称,而不知道 ClassName 如何用 FindWindows 找到它?
- 有没有与设备管理有关的消息?
int GetEncoderClsid(const WCHAR* format, CLSID* pClsid)
{
UINT num = 0; // number of image encoders
UINT size = 0; // size of the image encoder array in bytes ImageCodecInfo* pImageCodecInfo = NULL; GetImageEncodersSize(&num, &size);
if(size == 0)
return -1; // Failure pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
if(pImageCodecInfo == NULL)
return -1; // Failure GetImageEncoders(num, size, pImageCodecInfo); for(UINT j = 0; j < num; ++j)
{
if( wcscmp(pImageCodecInfo[j].MimeType, format) == 0 )
{
*pClsid = pImageCodecInfo[j].Clsid;
free(pImageCodecInfo);
return j; // Success
}
} free(pImageCodecInfo);
return -1; // Failure
}// 保存图片代码
CA2W wDesFilePath(DesFilePath);
CLSID Clsid;
GetEncoderClsid(L"image/bmp", &Clsid);
pImage->Save(wDesFilePath, &Clsid, NULL);
第二个问题,可能是在OnPaint里没有构造CPaintDC或调用了父类的OnPaint,CPaintDC在构造函数里调用了::BeginPaint在析构函数里调用了::EndPaint,这两个函数没有成对出现或混乱可能会引起CPU占用高,注意只是可能是这样。
以下是源码:
void CDView::OnPic()
{
// TODO: Add your command handler code here
static char BASED_CODE szFilter[] = "BMP Files(*.bmp)|*.bmp|JPEG Files(*.jpeg)|*.jpeg";
CFileDialog FileDlg (TRUE,"bmp",NULL,OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST,szFilter);
if (IDOK == FileDlg.DoModal())
{
CString path;
path = FileDlg.GetPathName();
if (!path.IsEmpty())
{
USES_CONVERSION;
Image m_pImage(A2CW(path));
CDC* pDC = GetDC();
Graphics m_Graphic(pDC->m_hDC);
m_Graphic.DrawImage(&m_pImage,Point(10,10));
CLSID m_clsid;
m_pImage.GetRawFormat(&m_clsid);//这样得到压缩类型我跟踪了以下,是正确的
int k = m_pImage.Save(L"fdm.bmp",&m_clsid,NULL);//我是打开一个BMP图片进行测试,
//再将它保存为另外的一个名字fdm.bmp
CString s;
s.Format("k is: %d",k);
MessageBox(s); }
}
}
我就是不知道错误类型说是指定的图片文件不存在是什么意思,是m_pImage不存在呢,还是L“fdm.bmp”不存在。执行完后,倒是创建了一个名字为fdm.bmp的文件,可是大小是0;到底怎么回事呢?
我第二个问题还是没有解决,不知道为什么給控件加上OnPaint函数后,CPU占用率很大,一下是源代码,帮忙看看吧,非常非常感谢!!!
void CMyStatic::OnPaint()
{
CPaintDC dc(this); // device context for painting
InvalidateRect(NULL);
CRect r;
GetWindowRect(&r);
if(this->path!="")//path 是图片的路径,我是动态插入图片,创建一个CMyStatic控件,图片画在上面,
//图片的路径保存在CMyStatic的数据成员path中
{ USES_CONVERSION;
Image m_pImage(A2CW(path));
Graphics m_Graphic(dc);
Point destinationPoints[] = {
Point(0,0), // destination for upper-left point of original
Point(r.Width(), 0), // destination for upper-right point of original
Point(0, r.Height())}; // destination for lower-left point of original m_Graphic.DrawImage(&m_pImage,destinationPoints,3);
} // Do not call CStatic::OnPaint() for painting messages
}
image=Image::FromFile(strjpg,true
Image* pThumbnail = image->GetThumbnailImage(180/*X坐标大小*/, 150/*Y坐标大小*/, NULL, NULL);//GetThumbnailImage是实现缩略图功能
graphics.DrawImage(pThumbnail, 0, 0, pThumbnail->GetWidth(), pThumbnail->GetHeight());