求mfc图像处理中从外部载入jpeg图片的代码
我已经有载入bmp图片的代码,目前程序也能运行。想添加能载入jpeg图片的代码。以下是我“打开图片”按钮所链接的代码:voidCImgproDlg::OnBtnopen(...
我已经有载入bmp图片的代码,目前程序也能运行。想添加能载入jpeg图片的代码。
以下是我“打开图片”按钮所链接的代码:
void CImgproDlg::OnBtnopen()
{
// TODO: Add your control notification handler code here
// TODO: Add your command handler code here
static char BASED_CODE szFilter[] = "Image Files (*.bmp)|*.bmp|*.jpeg|";
CFileDialog fdlg(TRUE,"bmp",NULL,OFN_HIDEREADONLY |
OFN_OVERWRITEPROMPT,szFilter,NULL);
fdlg.m_ofn.lpstrTitle="打开bmp或jpeg图象";
if(fdlg.DoModal()!=IDOK)
{
Invalidate();
m_open=FALSE;
return;
}
m_open=TRUE;
FileName=fdlg.GetPathName();
m_CurrentImage.LoadFromBMPFile(FileName);
/*:LoadFromBMPFile(CString bmpFileName)这个函数我已经实现,现求: LoadFromJPEGFile(CString jpegFileName);再把如何调用的方法告知一二。*/
m_ImHeight=m_CurrentImage.GetImageHeight();
m_ImWidth=m_CurrentImage.GetImageWidth();
HBITMAP hbitmap=(HBITMAP)::LoadImage(AfxGetInstanceHandle(),FileName, IMAGE_BITMAP,0,0, LR_CREATEDIBSECTION|LR_LOADFROMFILE);
CStatic * pWnd;
CDC * pDC;
//以IDC_OPENEDFILE为绘图区域
pWnd = (CStatic *)GetDlgItem(IDC_OPENEDFILE);
pDC = pWnd->GetDC();
CRect rect ;
pWnd->GetWindowRect(&rect);
int nwidth = rect.Width();
int nheight = rect.Height();
//设置静态控件的样式,使其可以使用位图,并试位标显示使居中
pWnd->ModifyStyle(0xF,SS_BITMAP|SS_CENTERIMAGE);
//设置静态控件显示位图
pWnd->SetBitmap(hbitmap);
//pDC->StretchBlt(rect.left,rect.top,rect.right,rect.bottom,pDC,0,0,rect.Height(),rect.Width(),0);
/*
if(m_open)
{
m_CurrentImage.LoadFromBMPFile(FileName);
m_CurrentImage.ShowImageMemory(pDC);
}
*/
//pDC->StretchBlt(rect.left,rect.top,rect.right,rect.bottom,pDC,0,0,rect.Height(),rect.Width(),0);
pWnd->InvalidateRect(rect);
pWnd->ReleaseDC(pDC);
/* 如果还能帮忙解决实现图片在固定区域显示时使用滚动条的效果的话,将大大追分,不胜感激!*/
BOOL CImage::LoadFromBMPFile(CString bmpFileName){}
这是我加载BMP图片的函数。如果哪位大侠知道怎么加载JPEG的话的,麻烦根据我这个写个类似的,不要就简单地给出一段代码,还要我修改的。我编程水平很烂的,这是我的毕设啊,望大家鼎力相助!!! 展开
以下是我“打开图片”按钮所链接的代码:
void CImgproDlg::OnBtnopen()
{
// TODO: Add your control notification handler code here
// TODO: Add your command handler code here
static char BASED_CODE szFilter[] = "Image Files (*.bmp)|*.bmp|*.jpeg|";
CFileDialog fdlg(TRUE,"bmp",NULL,OFN_HIDEREADONLY |
OFN_OVERWRITEPROMPT,szFilter,NULL);
fdlg.m_ofn.lpstrTitle="打开bmp或jpeg图象";
if(fdlg.DoModal()!=IDOK)
{
Invalidate();
m_open=FALSE;
return;
}
m_open=TRUE;
FileName=fdlg.GetPathName();
m_CurrentImage.LoadFromBMPFile(FileName);
/*:LoadFromBMPFile(CString bmpFileName)这个函数我已经实现,现求: LoadFromJPEGFile(CString jpegFileName);再把如何调用的方法告知一二。*/
m_ImHeight=m_CurrentImage.GetImageHeight();
m_ImWidth=m_CurrentImage.GetImageWidth();
HBITMAP hbitmap=(HBITMAP)::LoadImage(AfxGetInstanceHandle(),FileName, IMAGE_BITMAP,0,0, LR_CREATEDIBSECTION|LR_LOADFROMFILE);
CStatic * pWnd;
CDC * pDC;
//以IDC_OPENEDFILE为绘图区域
pWnd = (CStatic *)GetDlgItem(IDC_OPENEDFILE);
pDC = pWnd->GetDC();
CRect rect ;
pWnd->GetWindowRect(&rect);
int nwidth = rect.Width();
int nheight = rect.Height();
//设置静态控件的样式,使其可以使用位图,并试位标显示使居中
pWnd->ModifyStyle(0xF,SS_BITMAP|SS_CENTERIMAGE);
//设置静态控件显示位图
pWnd->SetBitmap(hbitmap);
//pDC->StretchBlt(rect.left,rect.top,rect.right,rect.bottom,pDC,0,0,rect.Height(),rect.Width(),0);
/*
if(m_open)
{
m_CurrentImage.LoadFromBMPFile(FileName);
m_CurrentImage.ShowImageMemory(pDC);
}
*/
//pDC->StretchBlt(rect.left,rect.top,rect.right,rect.bottom,pDC,0,0,rect.Height(),rect.Width(),0);
pWnd->InvalidateRect(rect);
pWnd->ReleaseDC(pDC);
/* 如果还能帮忙解决实现图片在固定区域显示时使用滚动条的效果的话,将大大追分,不胜感激!*/
BOOL CImage::LoadFromBMPFile(CString bmpFileName){}
这是我加载BMP图片的函数。如果哪位大侠知道怎么加载JPEG的话的,麻烦根据我这个写个类似的,不要就简单地给出一段代码,还要我修改的。我编程水平很烂的,这是我的毕设啊,望大家鼎力相助!!! 展开
3个回答
展开全部
在默认情况下,静态文本在生成Flash时就会把文本相应的矢量信息也保存到swf中,这种做法可以避免作品拿到别的机器上时因缺乏字体而无法正常显示文本的问题.而动态文本则不会作这样的处理,因为文本内容是变化的,如果像静态文本那样,就要把所有文字的矢量信息都生成到Flash中,导致文件变得很大.因此,默认情况下,在动态文本要显示字符的时候,Flash播放器会实时从系统里调用字体来显示,这样显示的字体叫设备字体.
设备字体调用到Flash以后,只剩下一些点阵信息,不存在矢量信息(这也是文本出现锯齿的原因).所以,它不能像图形那样进行几何运算,不能得出旋转后矢量到底是什么形状.
至于为什么不能透明,笔者认为,透明的显示还要计算透明层与下面层的颜色叠加.至于在哪个位置叠加,也是需要矢量信息的支持的.
然后,遮罩也是一种特效,它是需要遮罩层与被遮罩层的轮廓叠加才能算出图形的形状,所以设备字体显示的动态文本也是不行的.
问:如何解决这个问题呢?
答:很简单的一个办法.选中动态文本以后,在属性面板里点"字符"按钮,选择"所有字符"就可以了.因为这样实际上是嵌入了字体的矢量信息,所以就可以进行特效的处理了.
问:上面的问题是解决了,可是这样生成的文件很大(几M到十几M),何解?
答:上面说了,嵌入字体实际上是嵌入了字体的矢量信息.如果你嵌入了所有字符,实际上你把整个字体文件都放到swf文件里头.
假设你用的是宋体,你可以进行如下操作:
打开系统的控制面板,并双击"字体"进入
找到"宋体"后,看看文件的大小,你的swf也就会因此而增加(笔者的机这个文件为10M大,所以,嵌入字体轮廓后,swf就会大10M多.
问:这么大的Flash放到网上很不实际,想把它变小该如何处理?
答:这需要具体问题具体分析.
问:我的动态文本显示的肯定是数字,该如何操作?
答:"字符"选项那里按下图选择就可以了.这样swf文件只多了10个数字的矢量信息,文件不会大很多.
问:现在我要做一个导航菜单,里头用动态文本设置标签,而且动态文本需要使用特效的,该怎么做呢?
答:作为导航菜单,你的栏目一般都比较固定,所以,你的菜单项里用过哪些字就嵌哪些字的轮廓就可以了.(见下图)
这样,下次要更新栏目的时候,打开源文件,改文本值的同时,也相应地改变嵌入的字体轮廓.
问:但是更多的时候,要载入文本,而且内容根本就不知道.就好像这个:
我载入的歌词内容真的不知道,而且也不排除有英文,日文等,而且我又需要遮罩的效果,这该怎么做才能既有效果,又不会使文件变大呢?
答:虽然不能用遮罩,但是遮盖还是可以的,在本歌词播放器中,真正越出遮罩的部分只有以下红色标记的区域.
所以,在红色标记区域画两块跟背景色一样的矩形,盖住动态文本就可以了.
问:如果背景复杂些,不是单一颜色,而且可能有多个图层,那处理起来不就很麻烦?万一背景改了,或者要移动动态文本,那改起来岂不是很难?这问题可以解决吗?
答:遇到这种情况,建议把背景部分转换为一个元件,然后背景层上面放文本,文本上再放一层,内容跟背景层一样,背景层上面再放一层,用于遮罩一个背景层.其形状就是红色区域的形状(最终效果如下图)
如果要改背景的话,就直接修改背景元件,要移动文本的话,就把文本和遮罩一起移动,操作比较方便.
问:跟上面一样,也需要所有字符都能显示,但是要做透明效果,又该如何呢?
答:假设现在要用动态文本做这么个效果.
那是不是非要嵌入字体轮廓才能实现呢?
答案是否定的.
这个效果笔者用Flash做的,可能大家会想到这是用Alpha补间实现的.其实笔者是用了色调补间来做的,第一帧色调白色,最后一帧色调"无",文本本身红色.
这说明了,在背景为纯色的情况下,可以用色调来代替Alpha,而色调虽然是特效,但是它实际上只是颜色的复合,结果让文本显示单一颜色,调用
设备字体就可以显示出来.所以,在这种情况下,可以用色调效果来取代透明效果,以避免字体轮廓的嵌入.
但是如果背景本身是复杂的图片,或者是渐变色,多个色块组成的话,就非得要用透明度了.如果要避免字体轮廓的嵌入,建议采用一些替代效果,笔者会在后面给大家介绍替代效果的一些参考方案.
http://www2.flash8.net/teach/4642.htm
设备字体调用到Flash以后,只剩下一些点阵信息,不存在矢量信息(这也是文本出现锯齿的原因).所以,它不能像图形那样进行几何运算,不能得出旋转后矢量到底是什么形状.
至于为什么不能透明,笔者认为,透明的显示还要计算透明层与下面层的颜色叠加.至于在哪个位置叠加,也是需要矢量信息的支持的.
然后,遮罩也是一种特效,它是需要遮罩层与被遮罩层的轮廓叠加才能算出图形的形状,所以设备字体显示的动态文本也是不行的.
问:如何解决这个问题呢?
答:很简单的一个办法.选中动态文本以后,在属性面板里点"字符"按钮,选择"所有字符"就可以了.因为这样实际上是嵌入了字体的矢量信息,所以就可以进行特效的处理了.
问:上面的问题是解决了,可是这样生成的文件很大(几M到十几M),何解?
答:上面说了,嵌入字体实际上是嵌入了字体的矢量信息.如果你嵌入了所有字符,实际上你把整个字体文件都放到swf文件里头.
假设你用的是宋体,你可以进行如下操作:
打开系统的控制面板,并双击"字体"进入
找到"宋体"后,看看文件的大小,你的swf也就会因此而增加(笔者的机这个文件为10M大,所以,嵌入字体轮廓后,swf就会大10M多.
问:这么大的Flash放到网上很不实际,想把它变小该如何处理?
答:这需要具体问题具体分析.
问:我的动态文本显示的肯定是数字,该如何操作?
答:"字符"选项那里按下图选择就可以了.这样swf文件只多了10个数字的矢量信息,文件不会大很多.
问:现在我要做一个导航菜单,里头用动态文本设置标签,而且动态文本需要使用特效的,该怎么做呢?
答:作为导航菜单,你的栏目一般都比较固定,所以,你的菜单项里用过哪些字就嵌哪些字的轮廓就可以了.(见下图)
这样,下次要更新栏目的时候,打开源文件,改文本值的同时,也相应地改变嵌入的字体轮廓.
问:但是更多的时候,要载入文本,而且内容根本就不知道.就好像这个:
我载入的歌词内容真的不知道,而且也不排除有英文,日文等,而且我又需要遮罩的效果,这该怎么做才能既有效果,又不会使文件变大呢?
答:虽然不能用遮罩,但是遮盖还是可以的,在本歌词播放器中,真正越出遮罩的部分只有以下红色标记的区域.
所以,在红色标记区域画两块跟背景色一样的矩形,盖住动态文本就可以了.
问:如果背景复杂些,不是单一颜色,而且可能有多个图层,那处理起来不就很麻烦?万一背景改了,或者要移动动态文本,那改起来岂不是很难?这问题可以解决吗?
答:遇到这种情况,建议把背景部分转换为一个元件,然后背景层上面放文本,文本上再放一层,内容跟背景层一样,背景层上面再放一层,用于遮罩一个背景层.其形状就是红色区域的形状(最终效果如下图)
如果要改背景的话,就直接修改背景元件,要移动文本的话,就把文本和遮罩一起移动,操作比较方便.
问:跟上面一样,也需要所有字符都能显示,但是要做透明效果,又该如何呢?
答:假设现在要用动态文本做这么个效果.
那是不是非要嵌入字体轮廓才能实现呢?
答案是否定的.
这个效果笔者用Flash做的,可能大家会想到这是用Alpha补间实现的.其实笔者是用了色调补间来做的,第一帧色调白色,最后一帧色调"无",文本本身红色.
这说明了,在背景为纯色的情况下,可以用色调来代替Alpha,而色调虽然是特效,但是它实际上只是颜色的复合,结果让文本显示单一颜色,调用
设备字体就可以显示出来.所以,在这种情况下,可以用色调效果来取代透明效果,以避免字体轮廓的嵌入.
但是如果背景本身是复杂的图片,或者是渐变色,多个色块组成的话,就非得要用透明度了.如果要避免字体轮廓的嵌入,建议采用一些替代效果,笔者会在后面给大家介绍替代效果的一些参考方案.
http://www2.flash8.net/teach/4642.htm
展开全部
一看就知道是复制的
如果想在symbian中使用jpg或者png图片,则需要用到symbian提供的那个Multimedia ICL库里的类了。其中比较重的是CImageDecoder类,提供了对图像进行解码的功能。
来看看如何使用它的吧。先定义两个字串:
_LIT(KJPEGFile,"C:\\Data\\me.jpg");
_LIT(KJPEGType,"image/jpeg");
使用的代码比较简单,如下所示:
iDec = CImageDecoder::FileNewL(iRFs,KJPEGFile);
iParent->iBkImageMask=new (ELeave) CFbsBitmap();
iParent->iBkImageMask->Create( iDec-> FrameInfo().iOverallSizeInPixels,iDec-> FrameInfo().iFrameDisplayMode );
iDec->Convert( &iStatus, *(iParent->iBkImageMask) );
其中的iDec是CImageDecoder的实例,而iRFs是RFs的实例。而iParent->iBkImageMask则是一个CFbsBitmap对象实例。
也就是说,我们先利用CImageDecorder::FileNewL来打开一个图像文件(它会自已判断图像类型,我们也可以提供给它我们指定的图像类型)。然后这个图像的信息就保存在iDec->FrameInfo()中了,利用这个信息可以创建一个CFbsBitmap实例(因为symbian中所有显示的图像都是这种类型)。最后,调用CImageDecorder的异步函数Convert就可以将图像(jpeg 或者png格式的)转换成CFbsBitmap位图了。唯一的麻烦是Convert是一个异步函数,第一个参数是TRequestStatus类型(可以是一个活动对象的iStatus成员)。
除了CImageDecorder::FileNewL以外还有一个CImageDecorder:;DataNewL也可以用来从一个缓冲区的字节内容构造出图像数据,只是它第二个参数是TDesC8&类型的aSourceData。
[补充]
别忘了包括头文件 ImageConversion.h,还有引入库imageconversion.lib。
如果想在symbian中使用jpg或者png图片,则需要用到symbian提供的那个Multimedia ICL库里的类了。其中比较重的是CImageDecoder类,提供了对图像进行解码的功能。
来看看如何使用它的吧。先定义两个字串:
_LIT(KJPEGFile,"C:\\Data\\me.jpg");
_LIT(KJPEGType,"image/jpeg");
使用的代码比较简单,如下所示:
iDec = CImageDecoder::FileNewL(iRFs,KJPEGFile);
iParent->iBkImageMask=new (ELeave) CFbsBitmap();
iParent->iBkImageMask->Create( iDec-> FrameInfo().iOverallSizeInPixels,iDec-> FrameInfo().iFrameDisplayMode );
iDec->Convert( &iStatus, *(iParent->iBkImageMask) );
其中的iDec是CImageDecoder的实例,而iRFs是RFs的实例。而iParent->iBkImageMask则是一个CFbsBitmap对象实例。
也就是说,我们先利用CImageDecorder::FileNewL来打开一个图像文件(它会自已判断图像类型,我们也可以提供给它我们指定的图像类型)。然后这个图像的信息就保存在iDec->FrameInfo()中了,利用这个信息可以创建一个CFbsBitmap实例(因为symbian中所有显示的图像都是这种类型)。最后,调用CImageDecorder的异步函数Convert就可以将图像(jpeg 或者png格式的)转换成CFbsBitmap位图了。唯一的麻烦是Convert是一个异步函数,第一个参数是TRequestStatus类型(可以是一个活动对象的iStatus成员)。
除了CImageDecorder::FileNewL以外还有一个CImageDecorder:;DataNewL也可以用来从一个缓冲区的字节内容构造出图像数据,只是它第二个参数是TDesC8&类型的aSourceData。
[补充]
别忘了包括头文件 ImageConversion.h,还有引入库imageconversion.lib。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
CShowJpegView是我的的一个视图类,用的时候一定要将这个将成你自己的类哦!不是视图类也行,只要你能够传个CDC给这个函数就行。
/*
函数功能:显示JPG和GIF图片
参数说明 pDC:设备环境对象 strPath:要显示的图片路径
x:要显示的X位置 y:要显示的Y位置
*/
BOOL CShowJpegView::ShowJpgGif(CDC* pDC,CString strPath, int x, int y)
{
IStream *pStm;
CFileStatus fstatus;
CFile file;
LONG cb;
//打开文件并检测文件的有效性
if (file.Open(strPath,CFile::modeRead)&&
file.GetStatus(strPath,fstatus)&&
((cb = fstatus.m_size) != -1))
{
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, cb);
LPVOID pvData = NULL;
if (hGlobal != NULL)
{
pvData = GlobalLock(hGlobal);
if (pvData != NULL)
{
file.ReadHuge(pvData, cb);
GlobalUnlock(hGlobal);
CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);
}
}
}
else
{
return false;
} //打开文件结束
//显示JPEG和GIF格式的图片,GIF只能显示一帧,还不能显示动画,
//要显示动画GIF请使用ACTIVE控//件。
IPicture *pPic;
//load image from file stream
if(SUCCEEDED(OleLoadPicture(pStm,fstatus.m_size,TRUE,IID_IPicture,(LPVOID*)&pPic)))
{
OLE_XSIZE_HIMETRIC hmWidth;
OLE_YSIZE_HIMETRIC hmHeight;
pPic->get_Width(&hmWidth);
pPic->get_Height(&hmHeight);
double fX,fY;
//get image height and width
fX = (double)pDC->GetDeviceCaps(HORZRES)*(double)hmWidth/
((double)pDC->GetDeviceCaps(HORZSIZE)*100.0);
fY = (double)pDC->GetDeviceCaps(VERTRES)*(double)hmHeight/
((double)pDC->GetDeviceCaps(VERTSIZE)*100.0);
//use render function display image
if(FAILED(pPic->Render(*pDC,x,y,(DWORD)fX,(DWORD)fY,0,
hmHeight,hmWidth,-hmHeight,NULL)))
{
pPic->Release();
return false;
}
pPic->Release();
}
else
{
return false;
}
return true;
}
下面这三行代码是调用时函数的方法:
CString sPath;
sPath=_T("C:\\WINDOWS\\SYSTEM\\OOBE\\IMAGES\\BGMC.JPG");
ShowJpgGif(pDC,sPath,100,100);
如果你显示的是在一个控件在,请用如下方式获得CDC
//将pStatic指向要显示的地方
CDC* pDC = GetDlgItem(IDC_CONTROL)->GetDC();
以上是显示JPG和GIF图片的一个简单的方法,简单的同时也存在着不足。放大缩小功能和显示动画GIF文件没实现。
/*
函数功能:显示JPG和GIF图片
参数说明 pDC:设备环境对象 strPath:要显示的图片路径
x:要显示的X位置 y:要显示的Y位置
*/
BOOL CShowJpegView::ShowJpgGif(CDC* pDC,CString strPath, int x, int y)
{
IStream *pStm;
CFileStatus fstatus;
CFile file;
LONG cb;
//打开文件并检测文件的有效性
if (file.Open(strPath,CFile::modeRead)&&
file.GetStatus(strPath,fstatus)&&
((cb = fstatus.m_size) != -1))
{
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, cb);
LPVOID pvData = NULL;
if (hGlobal != NULL)
{
pvData = GlobalLock(hGlobal);
if (pvData != NULL)
{
file.ReadHuge(pvData, cb);
GlobalUnlock(hGlobal);
CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);
}
}
}
else
{
return false;
} //打开文件结束
//显示JPEG和GIF格式的图片,GIF只能显示一帧,还不能显示动画,
//要显示动画GIF请使用ACTIVE控//件。
IPicture *pPic;
//load image from file stream
if(SUCCEEDED(OleLoadPicture(pStm,fstatus.m_size,TRUE,IID_IPicture,(LPVOID*)&pPic)))
{
OLE_XSIZE_HIMETRIC hmWidth;
OLE_YSIZE_HIMETRIC hmHeight;
pPic->get_Width(&hmWidth);
pPic->get_Height(&hmHeight);
double fX,fY;
//get image height and width
fX = (double)pDC->GetDeviceCaps(HORZRES)*(double)hmWidth/
((double)pDC->GetDeviceCaps(HORZSIZE)*100.0);
fY = (double)pDC->GetDeviceCaps(VERTRES)*(double)hmHeight/
((double)pDC->GetDeviceCaps(VERTSIZE)*100.0);
//use render function display image
if(FAILED(pPic->Render(*pDC,x,y,(DWORD)fX,(DWORD)fY,0,
hmHeight,hmWidth,-hmHeight,NULL)))
{
pPic->Release();
return false;
}
pPic->Release();
}
else
{
return false;
}
return true;
}
下面这三行代码是调用时函数的方法:
CString sPath;
sPath=_T("C:\\WINDOWS\\SYSTEM\\OOBE\\IMAGES\\BGMC.JPG");
ShowJpgGif(pDC,sPath,100,100);
如果你显示的是在一个控件在,请用如下方式获得CDC
//将pStatic指向要显示的地方
CDC* pDC = GetDlgItem(IDC_CONTROL)->GetDC();
以上是显示JPG和GIF图片的一个简单的方法,简单的同时也存在着不足。放大缩小功能和显示动画GIF文件没实现。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询