DrawImageRect vs GrabImage

  1. 4 г. назад

    Есть спрайтщит (картинка с кадрами анимации), делаем LoadImage и:
    1-й вариант — DrawImageRect
    2-й вариант — GrabImage и DrawImage
    какой из вариантов лучше и почему? Какова производительность обоих вариантов?

  2. devolonter

    6 Jun 2014 Администратор
    4 г. назад исправил devolonter

    GrabImage — создает новое изображение путем захвата заданной прямоугольной области исходного изображения. Важно заметить, что при этом изображение не является копией исходного изображения, а лишь ссылается на него.

    Использование:
    — Получение изображений из текстурного атласа

    DraImageRect — позволяет выводить на экран заданную прямоугольную область изображения.

    Использование:
    — Вывод на экран прямоугольной области изображения
    — Анимация изображений, с непостоянным размером кадра

    Для анимации изображений с постоянным размером кадра удобнее всего использовать стандартные средства класса Image. Для этого достаточно при загрузке изображения указать количество кадров, и при вызове DrawImage указать номер кадра для отображения.

  3. 2 г. назад
    2 г. назад удалено serg
  4. Создаю скриншот в игре ,но не умею его сохранять в папку data

  5. devolonter

    27 Jan 2016 Администратор

    @serg Создаю скриншот в игре ,но не умею его сохранять в папку data

    В Monkey нет функции сохранения скриншота. Самый простой способ сохранить массив пикселей в самый простейший формат bmp. Но это не будет работать для HTML5

  6. А как ты сохраняешь массив в формате bmp?
    У меня была мысль конвертировать целочисленный массив в строку ,а затем уже сохранить но конвертация пока мне не удаётся...
    Нужен пример...

  7. devolonter

    13 Feb 2016 Администратор
    2 г. назад исправил devolonter

    Чтобы сохранить массив байт нужно использовать databuffer. К тому же в bmp есть обязательные заголовки. Вот рабочий пример найденный на оф. форуме

    Import brl.databuffer
    Import brl.filestream
    
    Class	BmpFile
    
    	Field	Width:Int  			' bmp image width
    	Field	Height:Int			' bmp image height
    	
    	Field	Pixels:Int[1]		' array for screen pixels
    
    	Field	FileSize:Int		' bmp file size
    	Field	Buffer:DataBuffer	' bmp file data (header + pixels)
    
    	Field	PadLineWidth:Int	' bmp real line size
    	
    	' default header for 24bpp image
    	Field	Header:Int[] = [ $42,$4D,$D6,$83,$00,$00,$00,$00,$00,$00,$36,$00,$00,$00,$28,$00,$00,$00,$6C,$00,$00,$00,$68,$00,$00,
    		$00,$01,$00,$18,$00,$00,$00,$00,$00,$00,$00,$00,$00,$C3,$0E,$00,$00,$C3,$0E,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ]
    	Const	FILE_SIZE		:=	$2
    	Const	IMAGE_WIDTH		:=	$12
    	Const	IMAGE_HEIGHT	:=	$16
    	Const	RAW_DATA_SIZE	:=	$22
    
    	Method Grab:Void( x:Int, y:Int, w:Int, h:Int )	' Call within OnRender after drawing the image to grab
    	
    		Width = w
    		Height = h
    		PadLineWidth = (((Width*3) + 3) / 4) * 4
    	
    		Pixels = Pixels.Resize( Width * Height )
    		ReadPixels Pixels, x, y, Width, Height
    			
    		FileSize = Header.Length() + PadLineWidth * Height
    		Buffer = New DataBuffer( FileSize )
    		
    		local ptr:Int
    		for ptr = 0 until Header.Length
    			Buffer.PokeByte ptr, Header[ptr]
    		next
    		
    		Buffer.PokeInt FILE_SIZE, FileSize
    		Buffer.PokeInt IMAGE_WIDTH, Width
    		Buffer.PokeInt IMAGE_HEIGHT, Height
    		Buffer.PokeInt RAW_DATA_SIZE, PadLineWidth * Height
    
    		local i:Int = 0
    		local pix:Int
    		for local ys:Int = 0 until Height
    			ptr = (Height - ys - 1) * PadLineWidth + Header.Length
    			for local xs:Int = 0 until Width
    				pix = Pixels[i]
    				Buffer.PokeByte ptr+0, pix & $ff
    				Buffer.PokeByte ptr+1, (pix shr 8) & $ff
    				Buffer.PokeByte ptr+2, (pix shr 16) & $ff
    				ptr += 3
    				i += 1
    			next
    		next
    		
    	End
    	  
    	Method	Save:Void( filename:String )	' filename without .bmp
    
    		Local file:=FileStream.Open( "monkey://internal/"+filename+".bmp","w" )
    		If file
    			file.Write Buffer, 0, FileSize
    			file.Close
    		Endif
    		
    	End
    	
    End

    Использование:

    bmp = New BmpFile()
    bmp.Grab(0, 0, DeviceWidth, DeviceHeight) 'этот метод обязательно выполняется в OnRender
    bmp.Save("screenshot")

    Изучив код можно адаптировать для сохранения произвольного массива данных

или зарегистрируйтесь чтобы комментировать!