| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 568 人关注过本帖
标题:[求助] 为什么我打开的图像比原图失真很多
只看楼主 加入收藏
ken_charles
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2006-7-7
收藏
 问题点数:0 回复次数:1 
[求助] 为什么我打开的图像比原图失真很多

为什么我打开的图像比原图失真很多呢?还有就是我的程序运行之后,有的时候图像文件能打开,同时也就运行“AfxMessageBox("The file is opened");”这一句,而有的时候图像文件打不开,而且“AfxMessageBox("The file is opened");”这一句代码也不运行,就是不知道原因,我的图像文件都是标准的BMP图。
我的代码如下:
打开代码:
void CTBinView::OnFileOpen()
{
static char szFilter[] = "BMP Files(*.BMP)|*.BMP||";

CFileDialog FileDlg( TRUE, NULL, NULL,OFN_HIDEREADONLY, szFilter );

if( FileDlg.DoModal() == IDOK && m_Dib.Load( FileDlg.GetPathName() ) )
{
InvalidateRect( NULL, TRUE );
UpdateWindow();
AfxMessageBox("The file is opened");
}

}
其中Load的函数声明如下:
BOOL CDib::Load( const char *pszFilename )
{
CFile cf;

if( !cf.Open( pszFilename, CFile::modeRead ) )
return( FALSE );

DWORD dwDibSize;
dwDibSize =cf.GetLength() - sizeof( BITMAPFILEHEADER );

unsigned char *pDib;
pDib = new unsigned char [dwDibSize];
if( pDib == NULL )
return( FALSE );

BITMAPFILEHEADER BFH;

try{
if( cf.Read( &BFH, sizeof( BITMAPFILEHEADER ) )
!= sizeof( BITMAPFILEHEADER ) ||BFH.bfType != 'MB' ||
cf.Read( pDib, dwDibSize ) != dwDibSize ){

delete [] pDib;
return( FALSE );
}
}

catch( CFileException *e ){
e->Delete();
delete [] pDib;
return( FALSE );
}

if( m_pDib != NULL )
delete m_pDib;

m_pDib = pDib;
m_dwDibSize = dwDibSize;

m_pBIH = (BITMAPINFOHEADER *) m_pDib;
m_pPalette =(RGBQUAD *) &m_pDib[sizeof(BITMAPINFOHEADER)];

m_nPaletteEntries = 1 << m_pBIH->biBitCount;
if( m_pBIH->biBitCount > 8 )
m_nPaletteEntries = 0;
else if( m_pBIH->biClrUsed != 0 )
m_nPaletteEntries = m_pBIH->biClrUsed;

m_pDibBits =&m_pDib[sizeof(BITMAPINFOHEADER)+m_nPaletteEntries*sizeof(RGBQUAD)];

if( m_Palette.GetSafeHandle() != NULL )
m_Palette.DeleteObject();

if( m_nPaletteEntries != 0 ){

LOGPALETTE *pLogPal = (LOGPALETTE *) new char
[sizeof(LOGPALETTE)+
m_nPaletteEntries*sizeof(PALETTEENTRY)];

if( pLogPal != NULL ){

pLogPal->palVersion = 0x300;
pLogPal->palNumEntries = m_nPaletteEntries;

for( int i=0; i<m_nPaletteEntries; i++ ){
pLogPal->palPalEntry[i].peRed =
m_pPalette[i].rgbRed;
pLogPal->palPalEntry[i].peGreen =
m_pPalette[i].rgbGreen;
pLogPal->palPalEntry[i].peBlue =
m_pPalette[i].rgbBlue;
}

m_Palette.CreatePalette( pLogPal );
delete [] pLogPal;
}
}

return( TRUE );

}

显示图像的代码如下:
void CTBinView::OnDraw(CDC* pDC)
{
CTBinDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);

RECT Rect;
GetClientRect( &Rect );
m_Dib.SetPalette( pDC );
m_Dib.Draw( pDC, 0, 0,Rect.right, Rect.bottom );
}

其中Draw函数的声明如下:
BOOL CDib::Draw( CDC *pDC, int nX, int nY, int nWidth, int nHeight )
{

if( m_pDib == NULL )
return( FALSE );

if( nWidth == -1 )
nWidth = m_pBIH->biWidth;
if( nHeight == -1 )
nHeight = m_pBIH->biHeight;

StretchDIBits( pDC->m_hDC, nX, nY,
nWidth, nHeight,
0, 0,
m_pBIH->biWidth, m_pBIH->biHeight,
m_pDibBits,
(BITMAPINFO *) m_pBIH,
BI_RGB, SRCCOPY );

return( TRUE );

}

搜索更多相关主题的帖子: 图像 失真 
2006-07-07 21:22
ligt0610
Rank: 1
等 级:新手上路
帖 子:204
专家分:5
注 册:2006-6-29
收藏
得分:0 
刚学这个东西
无能为力

通过不断的学习与思考才是提高自己能力的最好途径。。。。。。。
2006-07-07 23:58
快速回复:[求助] 为什么我打开的图像比原图失真很多
数据加载中...
 
   



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

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