Newsgroup: it.comp.programmare.win32
Titolo: serie di immagini in avi

Salve a tutti,
c'è qualcuno che ha un esempio di sorgente nel quale si scriva un file avi
partendo da una serie di immagini, magari in formato bitmap?
Grazie a tutti

 partendo da una serie di immagini, magari in formato bitmap?
Ti passo la classe che uso io (non č proprio scritta con i fiocchio, ma fa
il suo dovere...) :
//    Header
#include <vfw.h>
#define TEXT_HEIGHT 20
#define AVIIF_KEYFRAME 0x00000010L
#define BUFSIZE 260
class CAVIFile : public CObject
{
public:
 CAVIFile(LPCTSTR lpszFileName, int xdim = -1, int ydim = -1, int FrameRate
= 30);
 virtual ~CAVIFile();
 virtual bool AddFrame(CBitmap& bmp);
 CString GetFName() const             {return FName;};
 virtual bool IsOK() const            {return bOK;};
private:
 CString FName;
 int xDim;
 int yDim;
 int m_FrameRate;
 AVISTREAMINFO strhdr;
 PAVIFILE pfile;
 PAVISTREAM ps;
 PAVISTREAM psCompressed;
 PAVISTREAM psText;
 AVICOMPRESSOPTIONS opts;
 AVICOMPRESSOPTIONS FAR * aopts[1];
 DWORD dwTextFormat;
 char szText[BUFSIZE];
 int nFrames;
 bool bOK;
};
//    Source
#include "stdafx.h"
#include <windowsx.h>
#include <memory.h>
#include <mmsystem.h>
#include <vfw.h>
#include "writeavi.h"
static HANDLE  MakeDib( HBITMAP hbitmap, UINT bits )
{
 HANDLE              hdib ;
 HDC                 hdc ;
 BITMAP              bitmap ;
 UINT                wLineLen ;
 DWORD               dwSize ;
 DWORD               wColSize ;
 LPBITMAPINFOHEADER  lpbi ;
 LPBYTE              lpBits ;
 GetObject(hbitmap,sizeof(BITMAP),&bitmap) ;
 wLineLen = (bitmap.bmWidth*bits+31)/32 * 4;
 wColSize = sizeof(RGBQUAD)*((bits <= 8) ? 1<<bits : 0);
 dwSize = sizeof(BITMAPINFOHEADER) + wColSize +
  (DWORD)(UINT)wLineLen*(DWORD)(UINT)bitmap.bmHeight;
 hdib = GlobalAlloc(GHND,dwSize);
 if (!hdib)
  return hdib ;
 lpbi = (LPBITMAPINFOHEADER)GlobalLock(hdib) ;
 lpbi->biSize = sizeof(BITMAPINFOHEADER) ;
 lpbi->biWidth = bitmap.bmWidth ;
 lpbi->biHeight = bitmap.bmHeight ;
 lpbi->biPlanes = 1 ;
 lpbi->biBitCount = (WORD) bits ;
 lpbi->biCompression = BI_RGB ;
 lpbi->biSizeImage = dwSize - sizeof(BITMAPINFOHEADER) - wColSize ;
 lpbi->biXPelsPerMeter = 0 ;
 lpbi->biYPelsPerMeter = 0 ;
 lpbi->biClrUsed = (bits <= 8) ? 1<<bits : 0;
 lpbi->biClrImportant = 0 ;
 lpBits = (LPBYTE)(lpbi+1)+wColSize ;
 hdc = CreateCompatibleDC(NULL) ;
 GetDIBits(hdc,hbitmap,0,bitmap.bmHeight,lpBits,(LPBITMAPINFO)lpbi,
DIB_RGB_COLORS);
 lpbi->biClrUsed = (bits <= 8) ? 1<<bits : 0;
 DeleteDC(hdc) ;
 GlobalUnlock(hdib);
 return hdib ;
}
CAVIFile::CAVIFile(LPCTSTR lpszFileName, int xdim, int ydim, int FrameRate)
 : FName(lpszFileName),
 xDim(xdim), yDim(ydim), bOK(true), nFrames(0)
{
 m_FrameRate = FrameRate;
 pfile = NULL;
 ps = NULL;
 psCompressed = NULL;
 psText = NULL;
 aopts[0] = &opts;
 WORD wVer = HIWORD(VideoForWindowsVersion());
 if (wVer < 0x010A)
  bOK = false;
 else
  AVIFileInit();
}
CAVIFile::~CAVIFile()
{
 if (ps)
  AVIStreamClose(ps);
 if (psCompressed)
  AVIStreamClose(psCompressed);
 if (psText)
  AVIStreamClose(psText);
 if (pfile)
  AVIFileClose(pfile);
 WORD wVer = HIWORD(VideoForWindowsVersion());
 if (wVer >= 0x010A)
 {
  AVIFileExit();
 }
}
bool CAVIFile::AddFrame(CBitmap& bmp)
{
 HRESULT hr;
 if (!bOK)
  return false;
 LPBITMAPINFOHEADER alpbi = (LPBITMAPINFOHEADER)GlobalLock(MakeDib(bmp,
24));
 if (alpbi == NULL)
  return false;
 if (xDim>=0 && xDim != alpbi->biWidth)
 {
  GlobalFreePtr(alpbi);
  return false;
 }
 if (yDim>=0 && yDim != alpbi->biHeight)
 {
  GlobalFreePtr(alpbi);
  return false;
 }
 xDim = alpbi->biWidth;
 yDim = alpbi->biHeight;
 if (nFrames == 0)
 {
  hr = AVIFileOpen(&pfile, FName, OF_WRITE | OF_CREATE,  NULL);
  if (hr != AVIERR_OK)
  {
   GlobalFreePtr(alpbi);
   bOK = false;
   return false;
  }
  _fmemset(&strhdr, 0, sizeof(strhdr));
  strhdr.fccType                = streamtypeVIDEO;
  strhdr.fccHandler             = 0;
  strhdr.dwScale                = 1;
  strhdr.dwRate                 = m_FrameRate;
  strhdr.dwSuggestedBufferSize  = alpbi->biSizeImage;
  SetRect(&strhdr.rcFrame, 0, 0,
   (int) alpbi->biWidth,
   (int) alpbi->biHeight);
  hr = AVIFileCreateStream(pfile, &ps, &strhdr);
  if (hr != AVIERR_OK)
  {
   GlobalFreePtr(alpbi);
   bOK = false;
   return false;
  }
  _fmemset(&opts, 0, sizeof(opts));
  if (!AVISaveOptions(NULL, 0, 1, &ps, (LPAVICOMPRESSOPTIONS FAR *) &aopts))
  {
   GlobalFreePtr(alpbi);
   bOK = false;
   return false;
  }
  hr = AVIMakeCompressedStream(&psCompressed, ps, &opts, NULL);
  if (hr != AVIERR_OK)
  {
   GlobalFreePtr(alpbi);
   bOK = false;
   return false;
  }
  hr = AVIStreamSetFormat(psCompressed, 0,
        alpbi,     alpbi->biSize +   alpbi->biClrUsed * sizeof(RGBQUAD));
  if (hr != AVIERR_OK)
  {
   GlobalFreePtr(alpbi);
   bOK = false;
   return false;
  }
 }
 hr = AVIStreamWrite(psCompressed,
  nFrames,
  1,
  (LPBYTE) alpbi +
   alpbi->biSize +
   alpbi->biClrUsed * sizeof(RGBQUAD),
   alpbi->biSizeImage,   AVIIF_KEYFRAME,      NULL,  NULL);
 if (hr != AVIERR_OK)
 {
  GlobalFreePtr(alpbi);
  bOK = false;
  return false;
 }
 GlobalFreePtr(alpbi);
 nFrames++;
 return true;
}
Ma ciao !


CUT
Ciao,
mi intrometto nella discussione solo per chiedere una cosa:
la tua classe č convertibile in Visual Basic (5 o 6)???
Prima di cimentarmi nel tentativo provo a chiedertelo, magari
puoi subito stroncarmi con un NO oppure mi indirizzi
verso qualke altra soluzione.
Saluti,
Pusky

 verso qualke altra soluzione.
Certo che è convertibile, le funzioni che uso (AVIStreamClose, AVIFileClose,
ecc...) sono delle comuni API, basta che effettui il link con il file
"Vfw32.lib", ma non chiedermi l'equivalente in VB perchè ho l'allergia...
Ma ciao


Grazie della risposta, spero ti romperti l'anima per l'ultima volta ;-)
ma il file "Vfw32.lib" me lo trovo installato dal Visual C++ e non da VB.
1. Pensi che si possa utilizzare 'liberamente'?
2. Se mastichi un po di VB (con conseguente mal di denti...) sai dirmi se il
file in questione
lo devo usare tramite delle declare di funzioni ?
Ancora grazie.
Saluti,
Pusky

 lo devo usare tramite delle declare di funzioni ?
Scusami davvero, ma solo a sentire parlare di VogliamociBene mi viene un
prurito...

 lo devo usare tramite delle declare di funzioni ?
Come tutte le altre WinApi :-)