Показать сообщение отдельно
Старый 04.10.2005, 22:21   #3
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Я предлагаю сделать все средствами Blitz'а:

;Описание: Создание анимированной картинки из отдельных кадров

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
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием