| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2284 人关注过本帖
标题:用VC++编写一个图象压缩的系统
只看楼主 加入收藏
yelinglin
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2005-12-3
收藏
 问题点数:0 回复次数:9 
用VC++编写一个图象压缩的系统

大家好!
我现在急需求助于大家.我现在做毕业设计.我的指导老师让我做图象压缩,可我以前没学过我都不会.有哪位高手能帮帮小妹.小妹将不甚感激.我的毕业设计的功能有图象的读入,显示;图象的基本处理;图象压缩(lZW,huffman,dct)即可.有谁有这样程序的话记得发我邮箱里.
yelingl@163.com
谢了谢了谢了谢了

搜索更多相关主题的帖子: 图象 系统 编写 压缩 
2005-12-03 13:49
网事
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2005-12-2
收藏
得分:0 

对不起,我没有,我也是个新手啊,也跟你一样想在这里寻求一些帮助啊!!!
但是既然看了你的帖子,什么也不留下好像不太礼貌,就随便写两句吧。


2005-12-03 14:11
踏魔狼
Rank: 6Rank: 6
等 级:贵宾
威 望:24
帖 子:1322
专家分:33
注 册:2005-9-22
收藏
得分:0 

一年前做过,现在已被我删除掉了。


=×&D o I p R e E n C g T l X&×=
2005-12-05 09:31
yelinglin
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2005-12-3
收藏
得分:0 

那你一定会.
帮帮忙啊
我真的很头疼啊
小妹这厢有礼了

2005-12-05 10:03
踏魔狼
Rank: 6Rank: 6
等 级:贵宾
威 望:24
帖 子:1322
专家分:33
注 册:2005-9-22
收藏
得分:0 
做是没问题啦.不过最近不太有空.要抽空帮你完成(要点时间).

=×&D o I p R e E n C g T l X&×=
2005-12-05 10:13
yelinglin
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2005-12-3
收藏
得分:0 
bjarne:
你好啊!拜托拜托啊
这是我的毕业设计,我真的不会做啊!求求你了!我要实现的功能写的很清楚了.是基于VC++开发平台的.谢谢.
我要的不是很急,我明年答辩
2005-12-05 10:25
踏魔狼
Rank: 6Rank: 6
等 级:贵宾
威 望:24
帖 子:1322
专家分:33
注 册:2005-9-22
收藏
得分:0 
因家里不能上网了,所以这个程序的源代码我在网吧直接打上的.其中可能会打错.(打的我手都快断了!)

先建一个对话框应用程序命名为Res.再建一个名为StaticEx的基类为CStatic的静态类。在这个类加一个WM_PAINT的消息。在对话框上放一进程条,四个静态控件,两个按钮。其中两个静态控件ID分别为IDC_CURRENT_FILE用来显示压缩图象的目录;另一个ID为IDC_NUMBER用来显示压缩文件的个数.两个按钮的ID分别为ID_CHOOSE与ID_BALE,分别为这两个静态控件加一个变量。类型都为CStaticEx的。前一个用来选择图片的目录,后一个用来开始压缩.为进程条加一变量m_Progress类型为CProgressCtrl,还有程序中所有末定义的变量为全局变量.以下是源代码.

以下为全局变量:
(注意:这些全局变量我可能记错或者少写了)
CString num,cc,dirna;
BYTE*buf;
BYTE*tmp;
int bufadd[4000];
int len,pop,shulian;
///////////////////////////////////////////

CStaticEx的OnPaint()的代码如下:
void CStaticEx::OnPaint()
{
CPaintDC dc(this);
CString strText;
GetWindowText(strText);
Rectangle(dc,m_ctlRect.left-1,m_ctlRect.top-1,m_ctlRect.right+1,m_ctlRect.bottom+1);
dc.DrawText((LPCSTR)strText,strText.GetLength(),&m_ctlRect,
DT_PATH_ELLIPSIS|DT_VCENTER|DT_SINGLELINE);
}
其中m_ctlRect为CStaticEx的一个RECT类型的公有变量.

对话框类的OnInitDialog()的代码如下:
(注意:这是部分的)
RECT rc={0,0,0,0};
CWnd *cwStaticEx,*cwStaticEx;
if((cwStaticEx=GetDlgItem(IDC_CURRENT_FILE)!=NULL)
{
cwStaticEx->GetWindowRect(&rc);
rc.right=rc.right-rc.left;
rc.bottom=rc.bottom-rc.top;
rc.top=0;
rc.left=0;
m_ctlCurrentFile.m_ctlRect=rc;
}

if((cwStaticEx=GetDlgItem(IDC_NUMBER)!=NULL)
{
cwStaticEx->GetWindowRect(&rc);
rc.right=rc.right-rc.left;
rc.bottom=rc.bottom-rc.top;
rc.top=0;
rc.left=0;
m_ctlCurrentFile.m_ctlRect=rc;
}

m_Progress.SetRange(0,200);
m_Progress.SetPos(0);
m_Progress.SetStep(1);

////////////////////////////////////////

void CRes::opendir()
{
BROWSEINFO * m_pbi;
char m_buffer[MAX_PATH];
m_pbi=NULL;
m_pbi=new BROWSEINFO();
::ZeroMemory(m_pbi,sizeof(BROWSEINFO));
m_pbi->hwndOwner=GetSafeHwnd();
m_pbi->pszDisplayName=m_buffer;
m_pbi->ulFlags=BIF_EDITBOX;
ITEMIDLIST *id1=SHBrowseForFolder(m_pbi);
if(id1)
{SHGetPathFromIDList(id1,m_buffer);
dirna=m_buffer;
LPMALLOC lpm;
if(SHGetMalloc(&lpm)==NOERROR) lpm->Free(id1);
shulian=FindFile(dirna,"*.bmp");
}
delete[] m_pbi;
m_ctlCurrentFile.SetWindowText((LPCSTR)dirna);
num.Format("%d",shulian);
m_ctlNumber.SetWindowText((LPCSTR)num);
m_ctlCurrentFile.Invalidate(TRUE);
m_ctlNumber.Invalidate(TRUE);
}

void CRes::OnChoose()
{
opendir();
SetWindowText(dirna);
}

void CRes::OnBale()
{
if(atoi(num)==o)
{AfxMessageBox("没有图片数据!",MB_ICONHAND);
return;
}
CClientDC dc(this);
CString na;
na=dirna.Right(2);
len=0;
UINT nPos;
buf=(BYTE*) new BYTE[15*1024*1024];
tmp=(BYTE*) new BYTE[55000];
bufadd[1]=0;
m_Progress.SetRange(0,shulian);
m_Pos=m_Progress.GetPos();
for(int i=0;i<shulian;i++)
{
cc.Format("%s/c%05d.bmp",dirna,i);
LoadBmp(dc.m_hDC,cc,i);
SetWindowText(cc);
m_Progress.SetIt();
nPos=m_Progress.GetPos();
}
pop=i;
cc.Format("../%s.Bjarne",na);
CFile file;
if(!file.Open(cc,CFile::modeCreate|CFile::modeWrite,NULL) return;
file.Write(buf,len);
file.Close();
AfxMessageBox("完成压缩");
}

void LoadBmp(HDC hdc, CString fileName,int pop)
{
LPBITMAPINFOHEADER bi1,m_lpBi;
HANDLE m_Buf=NULL;
LPVOID lpmem=NULL;
CFile file;
if(!file.Open(fileName,CFile::modeRead)) return;
BITMAPFILEHEADER fileinfo;
file.Read(&fileinfo,sizeof(fileinfo));
if(fileinfo.bfType!=(('M'<<8)+'B')) return;
UINT m_off=fileinfo.bfoffBits;
UINT length=file.GetLength()-sizeof(BITMAPFILEHEANDER);
if(m_Buf!=NULL) {GlobalFree(m_Buf);m_Buf=NULL;}
m_Buf=GlobalAlloc(GMEM_MOVEABLE|GMEM_DISCARDABLE,length);
lpmem =GlobalLock(m_Buf);
//如果你是用VC6.0用ReadHuage如是.NET用回这个
if(length!=file.Read(lpmem,length))
{GlobalUnlock(m_Buf);
GlobalFree(m_Buf);
return;
}
bi1=(BITMAPINFOHEADER *)lpmem;
bi1->biSize=sizeof(BITMAPINFOHEADER);
bi1->biSizeImage=bil->biWidth*bi1->biHeight;
int cols=PaletteSize((LPBYTE) bil);
int len0=bil->biSize+bil->biSizeImage+cols;
if(bil->biSizeImage<10) return;
//压缩图片
m_lpBi=icmode(bi1);
bi1=(BITMAPINFOHEADER*) m_lpBi;
bil->biSize=sizeof(BITMAPINFOHEADER);
int len1=bil->biSize+bi1->biSizeImage+cols;
memcpy(buf+bufadd[pop],bi1,len1);
len+=len1;bufadd[pop+1]=len;
GlobalUnlock(m_Buf);GlobalFree(m_Buf);
cc.Format("%d:%d-%d %d",pop,len0,len1,len);
}

LPBITMAPINFOHEADER icmode(LPBITMAPINFOHEADER bi1)
{HIC hIC;
if(bi1==NULL) {AfxMessageBox("无图片数据");
return NULL;}
int cols=PaletteSize((LPBYTE) bi1);
LPBITMAPINFOHEADER m_lpBi=bi1;
if(bi1->biBitCount<=8)
hIC=ICOpen(mmioFOURCC('V','I','D','C'),mmioFOURCC('m','r','l','e'),
ICMODE_FASTCOMPRESS);
else
hIC=ICOpen(mmioFOURCC('V','I','D','C'),mmioFOURCC('m','s','v','c'),
ICMODE_FASTCOMPRESS);
HANDLE hDID=ICImageCompress(hIC,0,(LPBITMAPINFO) bi1,(LPBYTE)bi1+(WORD)bi1->biSize+cols,
NULL,6500,NULL);
LPBITMAPINFOHEADER lpBI1=(LPBITMAPINFOHEADER)GlobalLock(hDID);
memcpy((LPBYTE)m_lpBi,(LPBYTE)lpBI1,
lpBI1->biSize+lpBI1->biSizeImage+PaletteSize((LPBYTE)lpBI1);
ICClose(hIC);
GlobalUnlock(hDID;
GlobalFree(hDID);
return m_lpBi;
}

WORD PaletteSize(LPBYTE lpDIB)
{WORD wBitCount;
DWORD dwClrUsed;
dwClrUsed=((LPBITMAPINFOHEADER)lpDIB)->biCrlUsed;
if(dwClrUsed)
return (WORD) dwClrUsed*sizeof(RGBQUAD);
wBitCount=((LPBITMAPINFOHEADER)lpDIB)->biBitCount;
switch(wBitCount)
{
case 1: return 2*sizeof(RGBQUAD);
case 4: return 16*sizeof(RGBQUAD);
case 8: return 256*sizeof(RGBQUAD);
default: return 0;
}
}

int FindFile(CString DirName,CString ext)
{
WIN32_FIND_DATA FindFileData;
HANDLE hFindFile;
SetCurrentDirectory(DirName);
hFindFile=FinlFirstFile(ext,&FindFileData);
CString tFile;
int p=0;
if(hFindFile!=INVALID_HANDLE_VALVE)
{do{tFile=FindFileData.FileName;
if((tFile==".")||(tFile=="..")) contiune;
if(!(FindFileData.dwFileAttributes==FILE_ATTRIBUE_DIRECTORY))
{
p++;
}
while(FindNextFile(hFindFile,&FindFileData));
}
return p;
}

[此贴子已经被作者于2005-12-15 15:52:11编辑过]


=×&D o I p R e E n C g T l X&×=
2005-12-15 15:49
yelinglin
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2005-12-3
收藏
得分:0 

bjarne:
谢谢你的回复
非常感谢

2005-12-16 17:02
踏魔狼
Rank: 6Rank: 6
等 级:贵宾
威 望:24
帖 子:1322
专家分:33
注 册:2005-9-22
收藏
得分:0 
还有一正点忘了说,还要包含vfw.h头文件和vfw32.lib静态库文件.

=×&D o I p R e E n C g T l X&×=
2006-01-04 12:24
love_me
Rank: 1
等 级:新手上路
帖 子:85
专家分:0
注 册:2005-12-29
收藏
得分:0 

小妹~~如果你贴张照片在上面的话,我相信很多朋友会帮你的


灌水无罪! 顶贴有理! <0_0>
2006-01-04 19:50
快速回复:用VC++编写一个图象压缩的系统
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016775 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved