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