PAX-GAMES.NAROD.RU

Создание анимированной картинки из отдельных кадров

Если Вы когда-нибкдь пытались собрать анимированную картинку / текстуру в ручную то уже знаете что это очень нудная работа. Чтобы "облегчить Вам жизнь" я предлагаю следующую программу. (Конечно, если Вы пользуетесть Protean IDE то можете восползоваться плагином Image Strip Creator т.к. приведенный ниже код повторяет его назначеение).

Пусть у нас есть много кадров анимации в формате File####.typ , где #### - это номер кадра от 0000 до 9999, а typ тип картинки например: bmp, jpg, png (эти три формата поддерживает Blitz). Файлы с таким форматом имени по умолчанию создает 3DS MAX.

Необходимо создать анимированную картинку / текстуру которую Вы будете использовать при помощи функций LoadAnimImage() и LoadAnimTexture().

Приведенный ниже код иллюстрирует как можно собрать Ваши кадры анимации в один файл.

;Blitz / Blitz3D / BlitzPlus
;Раздел: Вспомогательные программы
;Описание: Создание анимированной картинки из отдельных кадров
;Скачено с сайта HTTP://PAX-GAMES.NAROD.RU/

Global Cmd$=Trim(Lower(CommandLine$())) ;Получение содержимого коммандной строки
If Not Cmd$ Then RuntimeError "Не указано имя файла!"
If Not FileType(Cmd$) Then RuntimeError "Неверно указано имя файла! Пример: 'lesson1.exe File0000.bmp'"
Global ImgType$=GetImgType$(Cmd$) ;Получение типа картинки (bmp, jpg или png)
If Not ImgType$ Then RuntimeError "Поддерживаются только изображения следующих типов: BMP, JPG, PNG!"
Global ImgName$=Left(Cmd$,Len(Cmd$)-8) ;Например: File0000.bmp => 0000.bmp = 8 символов
Global ImgIndex%=Int(Mid(Cmd$,Len(Cmd$)-7,4)) ;Получение индекса первой картинки (для случая если индекс начинается не с нуля)
Global maxWigth#=2048 maxHeight#=2048 ;Максимальный размер получаемой анимированной картинки
Global tempImg=LoadImage(Cmd$)
Global ImgWigth%=ImageWidth(tempImg): ImgHeigth%=ImageHeight(tempImg) ;Определение размеров одного кадра
FreeImage(tempImg)
Global HMaxImg#=Floor#(maxWigth#/ImgWigth%) ;Определение максимального кол-ва кадров по горизонтали
Global VMaxImg#=Floor#(maxHeight#/ImgHeigth%) ;Определение максимального кол-ва кадров по вертикали
Global MaxImg%=HMaxImg#*VMaxImg# ;Определение максимального кол-ва кадров
Global ImgCount%=TotalFrames%() ;Определение кол-ва кадров (по существующим файлам)
If ImgCount%>MaxImg% Then RuntimeError "Уменьшите кло-во кадров или их размер!"
Global CountRows%=Int(Ceil#((ImgCount/HMaxImg))) ;Определение кол-ва рядов кадров
Global AnimImgWidth%
;определение ширины картинки
If ImgCount%<HMaxImg# Then
AnimImgWidth% = ImgCount%*ImgWigth%
Else
AnimImgWidth% = HMaxImg#*ImgWigth%
EndIf
Global AnimImg=CreateImage(AnimImgWidth%, CountRows%*ImgHeigth%) ; Создание временной картинки анимации
Global X%=0, Y%=0 ;Начальные значения смещений для рисования очередного кадра

SetBuffer ImageBuffer(AnimImg) ;Установка активным буфера картинки AnimImg

;Рисование кадров на картинке
For I%=0 To ImgCount%-1
DrawImage(LoadImage(GetImgName$(ImgIndex%+I%)),X%,Y%)
If (X%+ImgWigth%)>maxWigth# Then
X%=0
Y%=Y%+ImgHeigth%
Else
X%=X%+ImgWigth%
EndIf
Next

;SaveBuffer(ImageBuffer(AnimImg),ImgName$+".bmp") ;Сохранение полученной картинки
SaveImage(AnimImg,ImgName$+".bmp") ;Эта строка аналогична предидущей

TT$="Картинка сохранена как "+ImgName+".bmp" + Chr$(13) + "Количество кадров: " + ImgCount% + Chr$(13)
TT$=TT$ + "Размер картинки: " + ImageWidth(AnimImg) +"X"+ ImageHeight(AnimImg)
FreeImage(AnimImg) ; Освобождение памяти
RuntimeError TT$
End ;необязательный оператор т.к. оператор RuntimeError автоматически завершает программу

;функция проверки типа файла
Function GetImgType$(ImgFile$)
T$=Right(ImgFile$,3)
Select T$
Case "bmp","jpg","png"
Return T$
Default
Return ""
End Select
End Function

;Функция рассчета кол-ва кадров
Function TotalFrames%()
Local I%=1
Local Index%=ImgIndex%
Repeat
I%=I%+1
Index%=Index%+1
If (FileType(GetImgName$(Index%))<>1) Then Return I%-1
Forever
End Function

;Функция служит для получения имени файла кадра с индексом Ind
;Например: Ind%=15,ImgName$="file", ImgType="bmp" => GetImgName$=file0015.bmp
Function GetImgName$(Ind%)
If (Ind < 10 And Ind >= 0) Then Return (ImgName$+"000"+Trim(Str(Ind%))+"."+ImgType$)
If (Ind < 100 And Ind >= 10) Then Return (ImgName$+"00"+Trim(Str(Ind%))+"."+ImgType$)
If (Ind < 1000 And Ind >= 100) Then Return (ImgName$+"0"+Trim(Str(Ind%))+"."+ImgType$)
If (Ind < 10000 And Ind >= 1000) Then Return (ImgName$+Trim(Str(Ind%))+"."+ImgType$)
RuntimeError "Error"
End Function

После того, когда Вы скомпилируете Программу и получите исполняемый файл (например lesson1.exe) то можете попробовать на заранее Вами заготовленных кадрах. Для этого необходимо запустить приложение следующим образом: lesson1.exe filename, где filename первый кадр вашей анимации.

Обо мне | Карта сайта | ©2005 PAX-GAMES

Hosted by uCoz