Re: jpeg2000 thumbnail
Hi Andrea,
this is the stuff who u need .
greetings
Karsten Schulz
(www.kahnsoft.de)
#include "stdafx.h"
#include "ThumbNailCtrl.h"
CThumbNailCtrl::CThumbNailCtrl()
{
m_pInfoImages = NULL;
p_oldbitmap = NULL;
}
CThumbNailCtrl::~CThumbNailCtrl()
{
}
BEGIN_MESSAGE_MAP(CThumbNailCtrl, CListCtrl)
ON_WM_CREATE()
ON_WM_DESTROY()
ON_WM_SIZE()
ON_WM_PAINT()
ON_WM_ERASEBKGND()
ON_WM_LBUTTONDOWN()
END_MESSAGE_MAP()
int CThumbNailCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if(CListCtrl::OnCreate(lpCreateStruct) == -1)
return -1;
CClientDC dc(this);
if(!m_memDC.CreateCompatibleDC(&dc))
return -1;
if(!(m_pInfoImages = new CImageList) )
return -1;
// CImageList
if(!m_pInfoImages->Create(THUMBWIDTH+THUMSPACE, THUMBWIDTH+THUMSPACE,
ILC_COLOR24 | ILC_MASK, 0, 0))
return -1;
CListCtrl::SetImageList(m_pInfoImages,LVSIL_NORMAL);
return 0;
}
void CThumbNailCtrl::OnDestroy()
{
CListCtrl::OnDestroy();
m_memDC.DeleteDC();
m_bitmap.DeleteObject();
if(m_pInfoImages)
{
m_pInfoImages->DeleteImageList();
delete m_pInfoImages,m_pInfoImages=0;
}
}
void CThumbNailCtrl::OnSize(UINT nType, int cx, int cy)
{
CListCtrl::OnSize(nType, cx, cy);
CClientDC dc(this);//CDC
CRect rcClient;
GetClientRect(&rcClient);
if(p_oldbitmap)
{
m_memDC.SelectObject(p_oldbitmap);
if(m_bitmap.m_hObject)
m_bitmap.DeleteObject();
p_oldbitmap=0;
}
if(!m_bitmap.CreateCompatibleBitmap(&dc,rcClient.Width(),rcClient.Height()))
return;
p_oldbitmap = m_memDC.SelectObject(&m_bitmap);
Redraw();
}
void CThumbNailCtrl::OnPaint()
{
CPaintDC dc(this); // device context for painting
CRect rc(dc.m_ps.rcPaint);
CRect rcClient, rcClip;
dc.GetClipBox( &rcClip );
GetClientRect( &rcClient );
CWnd* pWnd = GetDlgItem(0);//headerctrl
if(pWnd)
{
CRect rcItem;
pWnd->GetClientRect(&rcItem);
dc.ExcludeClipRect(&rcItem);
}
m_memDC.FillSolidRect( rc,RGB(255,255,255));
CWnd::DefWindowProc( WM_PAINT, (WPARAM)m_memDC.m_hDC, 0 );
dc.BitBlt(rc.left,rc.top,rc.Width(),rc.Height(),&m_memDC,rc.left,rc.top,SRCCOPY);
}
BOOL CThumbNailCtrl::OnEraseBkgnd(CDC* pDC)
{
return true;
}
CString CThumbNailCtrl::GetItemText(int Item)
{
return CListCtrl::GetItemText(Item,0);
}
bool CThumbNailCtrl::InsertItem(CDib *pDib,CString fName)
{
if(!m_pInfoImages->m_hImageList)
return false;
CBitmap imgbitmap;CClientDC dc(this);
CDC srcDC; srcDC.CreateCompatibleDC(&dc);
imgbitmap.CreateCompatibleBitmap(&dc,THUMBWIDTH+THUMSPACE,THUMBWIDTH+THUMSPACE); CBitmap* pImgOldBitmap = srcDC.SelectObject(&imgbitmap); srcDC.DrawFrameControl(CRect(0,0,THUMBWIDTH+THUMSPACE,THUMBWIDTH+THUMSPACE),DFC_BUTTON,DFCS_BUTTONPUSH); pDib->DrawStretch(&srcDC,pDib->GetMapMem(),CRect(THUMSPACE>>1,THUMSPACE>>1,THUMBWIDTH+(THUMSPACE>>1),THUMBWIDTH+(THUMSPACE>>1))); srcDC.SelectObject(pImgOldBitmap);srcDC.DeleteDC(); //CImageList int img = m_pInfoImages->Add( &imgbitmap,RGB(148,148,148) ); if(img < 0) return false; int id = CListCtrl::GetItemCount(); LV_ITEM lvItem;ZeroMemory(&lvItem,sizeof(LV_ITEM)); lvItem.mask = LVIF_IMAGE|LVIF_TEXT; lvItem.iImage = img; lvItem.iItem = id; lvItem.pszText = fName.GetBuffer(0); CListCtrl::InsertItem(&lvItem); Redraw(); return true;}bool CThumbNailCtrl::UpdateItem(CString ItemName,CDib *pDib,CString fName){ int id = FindItem(ItemName,true); if(id < 0) return false; return UpdateItem(pDib,fName,id);}bool CThumbNailCtrl::UpdateItem(CDib *pDib,CString fName, int id){ if(!m_pInfoImages->m_hImageList) return false; CBitmap imgbitmap;CClientDC dc(this); CDC srcDC; srcDC.CreateCompatibleDC(&dc); imgbitmap.CreateCompatibleBitmap(&dc,THUMBWIDTH+THUMSPACE,THUMBWIDTH+THUMSPACE); CBitmap* pImgOldBitmap = srcDC.SelectObject(&imgbitmap); srcDC.DrawFrameControl(CRect(0,0,THUMBWIDTH+THUMSPACE,THUMBWIDTH+THUMSPACE),DFC_BUTTON,DFCS_BUTTONPUSH); pDib->DrawStretch(&srcDC,pDib->GetMapMem(),CRect(THUMSPACE>>1,THUMSPACE>>1,THUMBWIDTH+(THUMSPACE>>1),THUMBWIDTH+(THUMSPACE>>1))); srcDC.SelectObject(pImgOldBitmap);srcDC.DeleteDC(); LV_ITEM lvItem; ZeroMemory(&lvItem,sizeof(LV_ITEM)); lvItem.iItem = id; lvItem.mask = LVIF_IMAGE; CListCtrl::GetItem(&lvItem); lvItem.mask = LVIF_TEXT; lvItem.iItem = id; lvItem.pszText = fName.GetBuffer(0); CListCtrl::SetItem(&lvItem); if(m_pInfoImages->Replace(lvItem.iImage,&imgbitmap,0) < 0) return false; Redraw(false); return true;}int CThumbNailCtrl::FindItem(CString ItemName,bool sensitiv){ LVFINDINFO info={0}; info.flags = (sensitiv?LVFI_PARTIAL:0)|LVFI_STRING; info.psz = ItemName; return CListCtrl::FindItem(&info);}CString CThumbNailCtrl::SelectedName(void){ LVFINDINFO info={0}; info.flags = LVIF_STATE; info.lParam = LVIS_SELECTED; int item = CListCtrl::FindItem(&info); if(item < 0) return CString(); return GetItemText(item);}void CThumbNailCtrl::SelectItem(CString ItemName){ int id = FindItem(ItemName,true); if(id < 0) return; for(int i=0; i<CListCtrl::GetItemCount(); i++) { if(i==id) { CListCtrl::SetItemState(i, LVIS_SELECTED, LVIS_SELECTED); CListCtrl::EnsureVisible(i, TRUE); }else CListCtrl::SetItemState(i, 0, LVIS_SELECTED); }}void CThumbNailCtrl::DeleteItem(CString ItemName){ int id = FindItem(ItemName); if(id < 0) return; CListCtrl::DeleteItem(id); Redraw();}void CThumbNailCtrl::DeleteItem(int id){ if(m_pInfoImages->m_hImageList) m_pInfoImages->Remove(id); CListCtrl::DeleteItem(id); Redraw();}void CThumbNailCtrl::DeleteAllItems(void){ CListCtrl::DeleteAllItems(); if(m_pInfoImages->m_hImageList) for(int i = 0; i < m_pInfoImages->GetImageCount(); i++) m_pInfoImages->Remove(i); Redraw(false);}void CThumbNailCtrl::Redraw(bool repos/*=true*/){ if(repos) { SetRedraw(false); register int cnt=CListCtrl::GetItemCount(); for(register int id=0; id<cnt; id++) { CRect rc; GetClientRect(&rc); register int width = max(0,rc.Width()-((THUMBWIDTH+THUMSPACE)>>1)); register int iAnzHorz = max(1,width/(THUMBWIDTH+THUMSPACE)); register int x = id%iAnzHorz; register int y = id/iAnzHorz; CPoint pt(x*(THUMBWIDTH+THUMSPACE),y*(THUMBWIDTH+THUMSPACE+32)); CListCtrl::SetItemPosition(id, pt); CListCtrl::EnsureVisible(id,true); } SetRedraw(true); RedrawWindow(0,0,RDW_INVALIDATE|RDW_UPDATENOW|RDW_ERASE|RDW_FRAME|RDW_ALLCHILDREN ); } RedrawWindow(0,0,RDW_INVALIDATE|RDW_UPDATENOW);}void CThumbNailCtrl::OnLButtonDown(UINT nFlags, CPoint point){ SetFocus(); CListCtrl::OnLButtonDown(nFlags, point);}#include "stdafx.h"#include "dib.h"#pragma comment(lib, "Winmm.lib")#pragma comment(lib, "vfw32.lib")CDib::CDib(void){ m_pBitmapInfo = 0; m_hBmp = 0; m_hDC = 0; m_pDat = 0; m_hOldBitmap = 0; m_hdd[0] = 0; m_hdd[1] = 0; m_bpp = 0; m_ti = GetTickCount(); m_fpscnt = 0; m_fps = 0;}CDib::~CDib(void){}CString CDib::GetFileName(void){ return m_filename;}HDC CDib::GetDC(void){ return m_hDC;}HBITMAP CDib::GetHBmp(void){ return m_hBmp;}int CDib::GetSrcWidth(void){ return m_srcw;}int CDib::GetSrcHeight(void){ return m_srch;}int CDib::GetWidth(void){ return m_pBitmapInfo?m_pBitmapInfo->bmiHeader.biWidth:0;}int CDib::GetHeight(void){ return m_pBitmapInfo?abs(m_pBitmapInfo->bmiHeader.biHeight):0;}int CDib::GetBpp(){ return m_pBitmapInfo?m_pBitmapInfo->bmiHeader.biBitCount:0;}bool CDib::SelectDriver(void){ return false;}bool CDib::SelectFormat(){ return 0;}void CDib::SelectInput(void){ return ;}bool CDib::ShowLive(HWND parent,CRect rc,DWORD flags){ return 0;}void CDib::Delete(){ m_filename.Empty(); if(m_pBitmapInfo) { delete m_pBitmapInfo; m_pBitmapInfo = 0; } if(m_hOldBitmap) SelectObject(m_hDC,m_hOldBitmap); if(m_hBmp) DeleteObject(m_hBmp),m_hBmp=0; if(m_hDC) DeleteDC(m_hDC),m_hDC=0; if(m_hdd[0]) DrawDibClose(m_hdd[0]),m_hdd[0]=0; if(m_hdd[1]) DrawDibClose(m_hdd[1]),m_hdd[1]=0;}//diese outputgr??e sollst du habenbool CDib::Create(int Width, int Height, int Bpp /*=32*/){ CDib::Delete(); //need for async drawdib! m_hdd[0] = DrawDibOpen(); m_hdd[1] = DrawDibOpen(); if(!m_hdd[0] || !m_hdd[1]) { AfxMessageBox("error: Dib:Create:DibOpen"); return false; } m_bpp = Bpp; m_pBitmapInfo = (BITMAPINFO*)(newchar[sizeof(BITMAPINFOHEADER)+((m_bpp==8?256:1)*sizeof(RGBQUAD))]); if(!m_pBitmapInfo) { Delete(); return FALSE; } m_pBitmapInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); m_pBitmapInfo->bmiHeader.biWidth = Width; m_pBitmapInfo->bmiHeader.biHeight =m_bpp==8|m_bpp==24?-Height:Height;//botomup m_pBitmapInfo->bmiHeader.biPlanes = 1; m_pBitmapInfo->bmiHeader.biBitCount = m_bpp; m_pBitmapInfo->bmiHeader.biCompression = BI_RGB; m_pBitmapInfo->bmiHeader.biSizeImage = Width*Height*(m_bpp>>3); m_pBitmapInfo->bmiHeader.biXPelsPerMeter = 0; m_pBitmapInfo->bmiHeader.biYPelsPerMeter = 0; m_pBitmapInfo->bmiHeader.biClrUsed = m_bpp==8?256:0; m_pBitmapInfo->bmiHeader.biClrImportant = 0; if(m_pBitmapInfo->bmiHeader.biClrUsed) SetColorbasis(m_pBitmapInfo, RGB(255,255,255),1); if(!(m_hDC = CreateCompatibleDC(0))) { Delete(); AfxMessageBox("error: Dib:Create:CreateCompatibleDC"); return false; } //make a Bitfield with max Texture Map for Hardware (ZielZwinge) m_hBmp = CreateDIBSection (m_hDC, m_pBitmapInfo, DIB_RGB_COLORS,(void**)&m_pDat, NULL, NULL); if(!m_hBmp) { Delete(); AfxMessageBox("error: Dib:Create:DIBSection"); return false; } m_hOldBitmap = (HBITMAP)SelectObject (m_hDC, m_hBmp);// Select hBitmap IntoOur Device Context (hdc) return true;}BOOL CDib::Draw(CDC *pDC,void *pMem,CRect rc,int xSrcOffset/*=0*/,intySrcOffset/*=0*/,int xDstOffset/*=0*/,int yDstOffset/*=0*/){ if(!m_pBitmapInfo || !pDC) { if(pDC)pDC->FillSolidRect(rc,0); return FALSE; } if(!pMem) pMem = m_pDat; ::SetDIBitsToDevice(pDC->m_hDC, rc.left+xDstOffset, rc.top+yDstOffset, rc.Width(), rc.Height(), rc.left+xSrcOffset, //SrcX abs(m_pBitmapInfo->bmiHeader.biHeight) - (rc.top+ySrcOffset) -rc.Height(), //SrcY 0, abs(m_pBitmapInfo->bmiHeader.biHeight), (void *)pMem, m_pBitmapInfo, DIB_RGB_COLORS//DIB_PAL_COLORS ); return TRUE;}BOOL CDib::DrawStretch(CDC *pDC,void *pmem,CRect rc){ if(!m_pBitmapInfo || !pDC || !pmem) { if(pDC)pDC->FillSolidRect(rc,0); return FALSE; } pDC->SetStretchBltMode(STRETCH_DELETESCANS); StretchDIBits(pDC->m_hDC, rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top, 0, 0, m_pBitmapInfo->bmiHeader.biWidth, abs(m_pBitmapInfo->bmiHeader.biHeight), pmem,m_pBitmapInfo,DIB_RGB_COLORS,SRCCOPY); return TRUE;}BOOL CDib::DrawStretch(CDC *pDC,void *pmem,CRect rc,CRect rcFrom){ if(!m_pBitmapInfo || !pDC || !pmem) { if(pDC)pDC->FillSolidRect(rc,0); return FALSE; } if(rcFrom.IsRectNull()) rcFrom.right = m_pBitmapInfo->bmiHeader.biWidth, rcFrom.bottom = abs(m_pBitmapInfo->bmiHeader.biHeight); pDC->SetStretchBltMode(STRETCH_DELETESCANS); StretchDIBits(pDC->m_hDC, rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top, rcFrom.left, abs(m_pBitmapInfo->bmiHeader.biHeight) -(rcFrom.top) - rcFrom.Height(), rcFrom.Width(), rcFrom.Height(), pmem,m_pBitmapInfo,DIB_RGB_COLORS,SRCCOPY); return TRUE;}//zeichnet in den Dib Buffer, egal wie die quelle (pBiHdr) formatiert istBOOL CDib::Draw(BYTE *pBits,BITMAPINFOHEADER * pbmi){ if(!pBits || !pbmi || !m_pBitmapInfo) return false; return DrawDibDraw (m_hdd[0],m_hDC,0,0,m_pBitmapInfo->bmiHeader.biWidth,abs(m_pBitmapInfo->bmiHeader.biHeight), pbmi,pBits, 0, 0, (m_srcw=pbmi->biWidth),(m_srch=pbmi->biHeight),0);}BOOL CDib::Draw(HBITMAP hBmp){ BITMAP bitmap; if(!::GetObject ((HBITMAP)hBmp, sizeof (bitmap), &bitmap)) return false; if(!bitmap.bmBits) return false; PBITMAPINFO pBitmapInfo = (BITMAPINFO*)(newchar[sizeof(BITMAPINFOHEADER)+(bitmap.bmBitsPixel==8?256:1)*sizeof(RGBQUAD)]); if(!pBitmapInfo) return false; pBitmapInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); pBitmapInfo->bmiHeader.biWidth = (m_srcw=bitmap.bmWidth); pBitmapInfo->bmiHeader.biHeight =(m_srch=bitmap.bmHeight);//botomup pBitmapInfo->bmiHeader.biPlanes = bitmap.bmPlanes; pBitmapInfo->bmiHeader.biBitCount = bitmap.bmBitsPixel; pBitmapInfo->bmiHeader.biCompression = BI_RGB; pBitmapInfo->bmiHeader.biSizeImage =(bitmap.bmWidth*bitmap.bmHeight*(bitmap.bmBitsPixel>>3)); pBitmapInfo->bmiHeader.biXPelsPerMeter = 0; pBitmapInfo->bmiHeader.biYPelsPerMeter = 0; pBitmapInfo->bmiHeader.biClrUsed = bitmap.bmBitsPixel==8?256:0; pBitmapInfo->bmiHeader.biClrImportant = 0; SetColorbasis(pBitmapInfo, RGB(255,255,255), 1, false); bool stat = Draw((LPBYTE)bitmap.bmBits,(PBITMAPINFOHEADER)pBitmapInfo); delete pBitmapInfo; return stat;}BOOL CDib::Draw(HDC hdc,void *pmem,CRect rc){ if(!pmem) { if(hdc)::FillRect(hdc,rc,0); return FALSE; } if(!pmem) return FALSE; return DrawDibDraw (m_hdd[1], hdc,rc.left,rc.top,rc.Width(),rc.Height(),//dest size &m_pBitmapInfo->bmiHeader,pmem, 0, 0,m_pBitmapInfo->bmiHeader.biWidth,m_pBitmapInfo->bmiHeader.biHeight,0);}void CDib::SetAlpha(BYTE Alpha){ int size = m_pBitmapInfo->bmiHeader.biWidth *m_pBitmapInfo->bmiHeader.biHeight; int BytePerPixel = m_pBitmapInfo->bmiHeader.biBitCount / 8; register BYTE *bits = m_pDat;//fast valve for(register int i=0;i<size;i++) bits[(BytePerPixel*i)+3] = Alpha;}float CDib::GetFps(void){ return CTimer::GetFpsf();}float CDib::GetFpsCnt(void){ m_fpscnt++; int tidiff(GetTickCount()-m_ti); if(tidiff >= 1000) { m_fps = (1000.0f/tidiff) * m_fpscnt; m_fpscnt = 0; m_ti = GetTickCount(); } return m_fps;}DWORD CDib::GetFileInfo(CString Path){ BOOL stat = 0; WIN32_FILE_ATTRIBUTE_DATA fdata; ZeroMemory(&fdata,sizeof(fdata)); stat = GetFileAttributesEx(Path.GetBuffer(),GetFileExInfoStandard,(LPVOID*)&fdata); return stat?fdata.nFileSizeLow:0;}bool CDib::GetClipboard(void){ ::OpenClipboard(0); HBITMAP hbmp = (HBITMAP)::GetClipboardData(CF_BITMAP); ::CloseClipboard(); if(hbmp) { BITMAP bitmap; if(!::GetObject ((HBITMAP)hbmp, sizeof (bitmap), &bitmap)) return false; HBITMAP hbresult = (HBITMAP)::CopyImage(hbmp,IMAGE_BITMAP,bitmap.bmWidth,bitmap.bmHeight,LR_CREATEDIBSECTION); CDib::Draw(hbresult); ::DeleteObject(hbresult); ::DeleteObject(hbmp); return true; } return false;}bool CDib::SetClipboard(void){ if(OpenClipboard(0)) { EmptyClipboard(); HANDLE hDib = BitmapToDIB(m_hBmp, 0); if(hDib) SetClipboardData(CF_DIB,hDib); CloseClipboard(); return true; } return false;}BYTE *CDib::GetGrayTable(void){ return &m_GrayMap[0];}void CDib::SetColorbasis(BITMAPINFO *pBmi, COLORREF basecol, BYTE chanels,bool setgraymap/*= true*/){ if(!pBmi) pBmi = m_pBitmapInfo; if(!pBmi) return; int step = max((chanels/8)*8,1); int loops = pBmi->bmiHeader.biClrUsed-(step>1?step:0); for(int i = 0; i < loops; i+=step) for(int n = 0; n < step; n++) { float r((GetRValue(basecol)/255.0f)*i), g((GetGValue(basecol)/255.0f)*i), b((GetBValue(basecol)/255.0f)*i); pBmi->bmiColors[i+n].rgbRed = r; pBmi->bmiColors[i+n].rgbGreen = g; pBmi->bmiColors[i+n].rgbBlue = b; pBmi->bmiColors[i+n].rgbReserved = 0; if(setgraymap) m_GrayMap[i+n] = (r+g+b)/3; }}void CDib::SetColorbasis(RGBQUAD *pRgbDat){ if(m_pBitmapInfo && pRgbDat) for(int i=0; i<256; i++) { m_pBitmapInfo->bmiColors[i].rgbRed = pRgbDat[i].rgbRed; m_pBitmapInfo->bmiColors[i].rgbGreen = pRgbDat[i].rgbGreen; m_pBitmapInfo->bmiColors[i].rgbBlue = pRgbDat[i].rgbBlue; m_pBitmapInfo->bmiColors[i].rgbReserved = pRgbDat[i].rgbReserved; }}bool CDib::Attach(HBITMAP hBmp)//:-){ if(!hBmp) return false; return CDib::Draw(hBmp);}bool CDib::Attach(CDib *pDib)//:-){ if(!pDib) return false; returnCDib::Draw((HBITMAP)::CopyImage(pDib->GetHBmp(),IMAGE_BITMAP,pDib->GetWidth(), pDib->GetHeight(),LR_CREATEDIBSECTION));}bool CDib::Load(LPCSTR fileName){ FILE *fp(0); DWORD fs(0); m_filename = fileName; if(!(fs=GetFileInfo(m_filename))) { if(!GetClipboard()) { HBITMAP hbmp = (HBITMAP)::LoadImage (AfxGetInstanceHandle(), MAKEINTRESOURCE(NULL), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION); if(hbmp) { CDib::Draw(hbmp); ::DeleteObject(hbmp); return true; } } return true; } // Read file in memory fp = fopen(m_filename.GetBuffer(0),"rb"); if(!fp) return false; BYTE *pMem = new BYTE[fs]; if(!pMem) return false; fread(pMem,1,fs,fp); fclose(fp); StreamToPic(pMem,fs); delete pMem; return true;}bool CDib::StreamToPic(BYTE *pMem, int Size){ // Use IPicture stuff to use JPG / GIF files IPicture* pPicture = 0; IStream* pStream = 0; LPBYTE hG = 0; DWORD fs = Size; hG = (LPBYTE) HeapAlloc( GetProcessHeap(), HEAP_GENERATE_EXCEPTIONS, fs); if(!hG) return false; memcpy(hG,pMem,fs); HRESULT hRes = ::CreateStreamOnHGlobal(hG,false,&pStream);// Create anIStream so IPicture can if(hRes != S_OK) { HeapFree(GetProcessHeap(), 0, hG); return false; } hRes = ::OleLoadPicture(pStream,fs,TRUE,IID_IPicture,(void**)&pPicture); if(hRes != S_OK) { pStream->Release(); HeapFree(GetProcessHeap(), 0, hG); return false; } short type;pPicture->get_Type(&type); if(type == PICTYPE_BITMAP) { HBITMAP hBmp = 0; hRes = pPicture->get_Handle( (OLE_HANDLE* )&hBmp);//Retrive GDI Object if(hRes == S_OK) CDib::Draw(hBmp); if(hBmp) ::DeleteObject(hBmp); } if(pStream) pStream->Release(); if(hG) HeapFree(GetProcessHeap(), 0, hG); if(pPicture) pPicture->Release(); return hRes == S_OK?true:false;}//save a bmp file from Dibbool CDib::Save(LPCSTR fname,LPVOID pMem /*= 0*/){ CString path(fname); if(path.IsEmpty()) return false; if(!pMem) pMem = (LPVOID)m_pDat; HANDLE hf; BITMAPFILEHEADER hdr; int tmp; hf = CreateFile(path.GetBuffer(0), GENERIC_READ | GENERIC_WRITE, (DWORD) 0, (LPSECURITY_ATTRIBUTES) NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, (HANDLE) NULL); if (hf == INVALID_HANDLE_VALUE) return false; hdr.bfType = 0x4d42; hdr.bfSize = (DWORD) (sizeof(BITMAPFILEHEADER) +m_pBitmapInfo->bmiHeader.biSize + m_pBitmapInfo->bmiHeader.biClrUsed * sizeof(RGBQUAD) +m_pBitmapInfo->bmiHeader.biSizeImage); hdr.bfReserved1 = 0; hdr.bfReserved2 = 0; hdr.bfOffBits = (DWORD) sizeof(BITMAPFILEHEADER) + m_pBitmapInfo->bmiHeader.biSize +m_pBitmapInfo->bmiHeader.biClrUsed * sizeof (RGBQUAD); if(!WriteFile(hf, (LPVOID) &hdr, sizeof(BITMAPFILEHEADER),(LPDWORD)&tmp, (LPOVERLAPPED) NULL)) { CloseHandle(hf); return false; } if(!WriteFile(hf, (LPVOID) &m_pBitmapInfo->bmiHeader,sizeof(BITMAPINFOHEADER) + m_pBitmapInfo->bmiHeader.biClrUsed * sizeof(RGBQUAD),(LPDWORD) &tmp, (LPOVERLAPPED) NULL)) { CloseHandle(hf); return false; } if(!WriteFile(hf, (LPCVOID) pMem,m_pBitmapInfo->bmiHeader.biSizeImage,(LPDWORD) &tmp, (LPOVERLAPPED) NULL) ) { CloseHandle(hf); return false; } CloseHandle(hf); return true;}BYTE * CDib::GetMapMem(void){ return m_pDat;}BITMAPINFOHEADER *CDib::GetBmih(void){ return &m_pBitmapInfo->bmiHeader;}bool CDib::Refresh(void){ CTimer::Refresh(); return false;}long CDib::Command(long Pos){ switch(Pos) { case VFW_TOSTART: return 1; case VFW_PLAY: return 0x0fffffff; case VFW_STOP: return 0; } return 0;}void CDib::Reset(void){ CTimer::Reset();}float CDib::GetFrameTime(void){ return CTimer::GetFrameTime();}void CDib::GrabFrame(void){}void CDib::TransparentBlt(CDC *pDC,int nXDest,int nYDest,int nWidth,intnHeight, HBITMAP hBitmap,int nXSrc,int nYSrc,COLORREFcolorTransparent,HPALETTE hPal){ CDC memDC,maskDC,tempDC; CBitmap bmpImage,maskBitmap,*pOldMemBmp(0),*pOldMaskBmp(0); //create some dc's maskDC.CreateCompatibleDC(pDC); memDC.CreateCompatibleDC(pDC); tempDC.CreateCompatibleDC(pDC); //create membitmap bmpImage.CreateCompatibleBitmap(pDC, nWidth, nHeight); pOldMemBmp = memDC.SelectObject(&bmpImage); //check for 8bit color if(pDC->GetDeviceCaps(RASTERCAPS) & RC_PALETTE && hPal) ::SelectPalette(pDC->m_hDC,hPal,FALSE),pDC->RealizePalette(), ::SelectPalette(memDC,hPal,FALSE); //set resources HBITMAP hOldTempBmp((HBITMAP)::SelectObject(tempDC.m_hDC,hBitmap)); memDC.BitBlt(0,0,nWidth,nHeight,&tempDC,nXSrc,nYSrc,SRCCOPY); //monochrome mask maskBitmap.CreateBitmap(nWidth,nHeight,1,1,NULL); pOldMaskBmp = maskDC.SelectObject(&maskBitmap); memDC.SetBkColor(colorTransparent); maskDC.BitBlt(0,0,nWidth,nHeight,&memDC,0,0,SRCCOPY); //AND mask memDC.SetBkColor(RGB(0,0,0)); memDC.SetTextColor(RGB(255,255,255)); memDC.BitBlt(0,0,nWidth,nHeight,&maskDC,0,0,SRCAND); //AND mask pDC->SetBkColor(RGB(255,255,255)); pDC->SetTextColor(RGB(0,0,0)); pDC->BitBlt(nXDest,nYDest,nWidth,nHeight,&maskDC,0,0,SRCAND); //Combine the foreground with background pDC->BitBlt(nXDest, nYDest, nWidth, nHeight, &memDC,0,0,SRCPAINT); //free resources ::SelectObject(tempDC.m_hDC,hOldTempBmp); maskDC.SelectObject(pOldMaskBmp); memDC.SelectObject(pOldMemBmp);}.."Andrea Visinoni" <andrea.visinoni@gmail.com> schrieb im Newsbeitragnews:2c5c3dae-3b59-45db-a31e-c6f93213f8d1@f63g2000hsf.googlegroups.com...> Hi there, i need to extract a thumbnail of very large jpeg2000 images.> Do someone have experience? i've tried jasper and rv-media lib, but> they perform a full decode and it takes too long.>> Bye Andrea