jpeg画像をサムネイル表示(50%縮小表示)したいのですが、
StretchBlt関数で縮小すると画像の色の境目あたりが
変な色になってしまいます。縮小表示で何かいい方法がありましたら、
ご教授ください。
開発環境は、
VC++6.0、Windows2000、PlatFormSDK
です。
CDocumentクラスとCViewクラスで構成されたMDIです。
ドキュメントクラスの「開く」イベントのときにJPEG画像ファイルを
選択して画像表示しています。
// 引数(lpszPathName)はjpegのファイル名
BOOL CTestDoc::OnOpenDocument(LPCTSTR lpszPathName)
{
LPDISPATCH pDisp;
COleVariant varName(lpszPathName);
long Status = OleLoadPictureFile(varName, &pDisp);
if ( Status >= 0 )
{
delete m_pPicture;
m_pPicture = NULL;
CDocument::DeleteContents();
ASSERT(m_pPicture == NULL);
m_pPicture = new CPictureHolder;
m_pPicture->SetPictureDispatch((LPPICTUREDISP)pDisp);
HBITMAP hBitmap = GetBitmap();
if (hBitmap == NULL)
return FALSE;
m_pBitmap = new CBitmap;
m_pBitmap = CBitmap::FromHandle(hBitmap);
return TRUE;
}
return FALSE;
}
ビュークラスのOnInitialUpdateでビットマップ画像のサイズを取得し、
表示時(OnDraw時)にサイズを半分にしてOnDrawで表示しています。
void CTestView::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();
CSize sizeTemp(600, 600);
SetScrollSizes(MM_HIENGLISH, sizeTemp);
CPddbDoc* pDoc = GetDocument();
if (mDc->GetSafeHdc() == NULL)
{
BITMAP bm;
CClientDC dc(this);
OnPrepareDC(&dc);
mBitmap = pDoc->GetPicture();
mDc->CreateCompatibleDC(&dc);
mDc->SelectObject(mBitmap);
mBitmap->GetObject(sizeof(bm), &bm);
mSizeOriginal.cx = bm.bmWidth;
mSizeOriginal.cy = bm.bmHeight;
mSizeNew = mSizeOriginal;
dc.DPtoLP(&mSizeNew);
}
}
void CTestView::OnDraw(CDC* pDC)
{
// 半分のサイズで表示
pDC->StretchBlt(0, 0, mSizeNew.cx/2, -mSizeNew.cy/2, mDc,
0, 0, mSizeOriginal.cx, mSizeOriginal.cy, SRCCOPY);
}
いろはです。
SetStretchBltModeを使うとどうでしょう?
ありがとうございます。
StretchBltの前にSetStretchBltModeを入れたら
滑らかな画像が表示されました。
以下、ソースです。
pDC->SetStretchBltMode(HALFTONE);
pDC->StretchBlt(0, 0, mSizeNew.cx/2, -mSizeNew.cy/2, mDc,
0, 0, mSizeOriginal.cx, mSizeOriginal.cy, SRCCOPY);