Модераторы: Snowy, Alexeis, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> из набора *.bmp в *.avi, Как преобразовать 
:(
    Опции темы
cot
Дата 13.5.2004, 06:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 4.6.2003

Репутация: нет
Всего: нет



Наоборот понятно. Тут уже обсуждали. А вот как из набора картинок сделать мультфильм?
PM MAIL   Вверх
Alex
Дата 13.5.2004, 07:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: 1
Всего: 162



BMP ---> AVI (для TAnimate)
TAnimate is a rather nice component. However if you don't want to use the built in AVI files and want to create your own AVI files from BMP files, then you may have a problem as there is no tool in Delphi to do this.

While browsing the web for information on AVI file formats I came upon a site www.shrinkwrapvb.com/avihelp/avihelp.htm that is maintained by Ray Mercer. In this tutorial he explains how to manipulate,read and write AVI files. I was particularly interested in "Step 5" in which he shows a utility that takes a list of BMP files that creates an AVI file which can be used by the TAnimate component. The only problem was that the examples are in Visual Basic, thus a conversion to Delphi was required.

I have posted this procedure
CreateAVI(const FileName : string; BMPFileList : TStrings; FramesPerSec : integer = 10);

To keep the text of the example simple and readable I have left out most to the error checking (try except etc.). You can also play with the AVISaveOptions dialog box, but I can only seem to get it to work with "Full Frames Uncompressed" with BMP files. Can anyone shed some light on this ?

Errors you should check for are ..
All files are valid BMP files and are of the same size.
All Blockreads are valid with no read errors.

Ray has a downloadable EXE that works quite nicely, however I am about to write my own utility that incorporates the following ...

Multiline file selection.
Listbox line reordering (drag/drop).
Sort File list
Layout Save and Load .
AVI Preview.

(I have beta version 1.0.0.0 ready, if anyone wants a copy of exe or source code, drop me a mail at [email protected])

For further info on AVI files I recommend you vist Ray's site at http://www.shrinkwrapvb.com/avihelp/avihelp.htm it really is a well written tutorial (even if it is in Visual Basic)

Код
const
 // AVISaveOptions Dialog box flags

 ICMF_CHOOSE_KEYFRAME = 1; // show KeyFrame Every box
 ICMF_CHOOSE_DATARATE = 2; // show DataRate box
 ICMF_CHOOSE_PREVIEW = 4; // allow expanded preview dialog
 ICMF_CHOOSE_ALLCOMPRESSORS = 8; // don't only show those that
 // can handle the input format
 // or input data
 AVIIF_KEYFRAME = 10;

type

 AVI_COMPRESS_OPTIONS = packed record
   fccType: DWORD; // stream type, for consistency
   fccHandler: DWORD; // compressor
   dwKeyFrameEvery: DWORD; // keyframe rate
   dwQuality: DWORD; // compress quality 0-10,000
   dwBytesPerSecond: DWORD; // bytes per second
   dwFlags: DWORD; // flags... see below
   lpFormat: DWORD; // save format
   cbFormat: DWORD;
   lpParms: DWORD; // compressor options
   cbParms: DWORD;
   dwInterleaveEvery: DWORD; // for non-video streams only
 end;

 AVI_STREAM_INFO = packed record
   fccType: DWORD;
   fccHandler: DWORD;
   dwFlags: DWORD;
   dwCaps: DWORD;
   wPriority: word;
   wLanguage: word;
   dwScale: DWORD;
   dwRate: DWORD;
   dwStart: DWORD;
   dwLength: DWORD;
   dwInitialFrames: DWORD;
   dwSuggestedBufferSize: DWORD;
   dwQuality: DWORD;
   dwSampleSize: DWORD;
   rcFrame: TRect;
   dwEditCount: DWORD;
   dwFormatChangeCount: DWORD;
   szName: array[0..63] of char;
 end;

 BITMAPINFOHEADER = packed record
   biSize: DWORD;
   biWidth: DWORD;
   biHeight: DWORD;
   biPlanes: word;
   biBitCount: word;
   biCompression: DWORD;
   biSizeImage: DWORD;
   biXPelsPerMeter: DWORD;
   biYPelsPerMeter: DWORD;
   biClrUsed: DWORD;
   biClrImportant: DWORD;
 end;

 BITMAPFILEHEADER = packed record
   bfType: word; //"magic cookie" - must be "BM"
   bfSize: integer;
   bfReserved1: word;
   bfReserved2: word;
   bfOffBits: integer;
 end;

 // DLL External declarations

function AVISaveOptions(Hwnd: DWORD; uiFlags: DWORD; nStreams: DWORD;
 pPavi: Pointer; plpOptions: Pointer): boolean;
 stdcall; external 'avifil32.dll';

function AVIFileCreateStream(pFile: DWORD; pPavi: Pointer; pSi: Pointer): integer;
 stdcall; external 'avifil32.dll';

function AVIFileOpen(pPfile: Pointer; szFile: PChar; uMode: DWORD;
 clSid: DWORD): integer;
 stdcall; external 'avifil32.dll';

function AVIMakeCompressedStream(psCompressed: Pointer; psSource: DWORD;
 lpOptions: Pointer; pclsidHandler: DWORD): integer;
 stdcall; external 'avifil32.dll';

function AVIStreamSetFormat(pAvi: DWORD; lPos: DWORD; lpGormat: Pointer;
 cbFormat: DWORD): integer;
 stdcall; external 'avifil32.dll';

function AVIStreamWrite(pAvi: DWORD; lStart: DWORD; lSamples: DWORD;
 lBuffer: Pointer; cBuffer: DWORD; dwFlags: DWORD;
 plSampWritten: DWORD; plBytesWritten: DWORD): integer;
 stdcall; external 'avifil32.dll';

function AVISaveOptionsFree(nStreams: DWORD; ppOptions: Pointer): integer;
 stdcall; external 'avifil32.dll';

function AVIFileRelease(pFile: DWORD): integer; stdcall; external 'avifil32.dll';

procedure AVIFileInit; stdcall; external 'avifil32.dll';

procedure AVIFileExit; stdcall; external 'avifil32.dll';

function AVIStreamRelease(pAvi: DWORD): integer; stdcall; external 'avifil32.dll';

function mmioStringToFOURCCA(sz: PChar; uFlags: DWORD): integer;
 stdcall; external 'winmm.dll';

// ============================================================================
// Main Function to Create AVI file from BMP file listing
// ============================================================================

procedure CreateAVI(const FileName: string; IList: TStrings;
 FramesPerSec: integer = 10);
var
 Opts: AVI_COMPRESS_OPTIONS;
 pOpts: Pointer;
 pFile, ps, psCompressed: DWORD;
 strhdr: AVI_STREAM_INFO;
 i: integer;
 BFile: file;
 m_Bih: BITMAPINFOHEADER;
 m_Bfh: BITMAPFILEHEADER;
 m_MemBits: packed array of byte;
 m_MemBitMapInfo: packed array of byte;
begin
 DeleteFile(FileName);
 Fillchar(Opts, SizeOf(Opts), 0);
 FillChar(strhdr, SizeOf(strhdr), 0);
 Opts.fccHandler := 541215044; // Full frames Uncompressed
 AVIFileInit;
 pfile := 0;
 pOpts := @Opts;

 if AVIFileOpen(@pFile, PChar(FileName), OF_WRITE or OF_CREATE, 0) = 0 then
 begin
   // Determine Bitmap Properties from file item[0] in list
   AssignFile(BFile, IList[0]);
   Reset(BFile, 1);
   BlockRead(BFile, m_Bfh, SizeOf(m_Bfh));
   BlockRead(BFile, m_Bih, SizeOf(m_Bih));
   SetLength(m_MemBitMapInfo, m_bfh.bfOffBits - 14);
   SetLength(m_MemBits, m_Bih.biSizeImage);
   Seek(BFile, SizeOf(m_Bfh));
   BlockRead(BFile, m_MemBitMapInfo[0], length(m_MemBitMapInfo));
   CloseFile(BFile);

   strhdr.fccType := mmioStringToFOURCCA('vids', 0); // stream type video
   strhdr.fccHandler := 0; // def AVI handler
   strhdr.dwScale := 1;
   strhdr.dwRate := FramesPerSec; // fps 1 to 30
   strhdr.dwSuggestedBufferSize := m_Bih.biSizeImage; // size of 1 frame
   SetRect(strhdr.rcFrame, 0, 0, m_Bih.biWidth, m_Bih.biHeight);

   if AVIFileCreateStream(pFile, @ps, @strhdr) = 0 then
   begin
     // if you want user selection options then call following line
     // (but seems to only like "Full frames Uncompressed option)

     // AVISaveOptions(Application.Handle,
     //                ICMF_CHOOSE_KEYFRAME or ICMF_CHOOSE_DATARATE,
     //                1,@ps,@pOpts);
     // AVISaveOptionsFree(1,@pOpts);

     if AVIMakeCompressedStream(@psCompressed, ps, @opts, 0) = 0 then
     begin
       if AVIStreamSetFormat(psCompressed, 0, @m_memBitmapInfo[0],
         length(m_MemBitMapInfo)) = 0 then
       begin

         for i := 0 to IList.Count - 1 do
         begin
           AssignFile(BFile, IList[i]);
           Reset(BFile, 1);
           Seek(BFile, m_bfh.bfOffBits);
           BlockRead(BFile, m_MemBits[0], m_Bih.biSizeImage);
           Seek(BFile, SizeOf(m_Bfh));
           BlockRead(BFile, m_MemBitMapInfo[0], length(m_MemBitMapInfo));
           CloseFile(BFile);
           if AVIStreamWrite(psCompressed, i, 1, @m_MemBits[0],
             m_Bih.biSizeImage, AVIIF_KEYFRAME, 0, 0) <> 0 then
           begin
             ShowMessage('Error during Write AVI File');
             break;
           end;
         end;
       end;
     end;
   end;

   AVIStreamRelease(ps);
   AVIStreamRelease(psCompressed);
   AVIFileRelease(pFile);
 end;

 AVIFileExit;
 m_MemBitMapInfo := nil;
 m_memBits := nil;
end;


Взято с Delphi Knowledge Base
http://www.baltsoft.com/


--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
cot
Дата 14.5.2004, 05:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 4.6.2003

Репутация: нет
Всего: нет



Cпасибо!
PM MAIL   Вверх
devmstr
Дата 15.5.2004, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
**


Профиль
Группа: Участник
Сообщений: 879
Регистрация: 28.4.2004
Где: Ukraine

Репутация: нет
Всего: 11



Еще один способ использовать компонент AviWriter2


--------------------
Think different ©Steve Jobs 
user posted image
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




[ Время генерации скрипта: 0.0642 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.