scaling images realtime???

Blitz3D Forums/Blitz3D Beginners Area/scaling images realtime???

I have seen other posts that mention that blitz3d has a way of scaling images (not using scaleimage, resizeimage, or any dlls) in real time??? Is this true? If so I have been missing out on a lot...

There was a lib that did this, using 2d commands, but it replaced the 2d command set. The only other way is to use a 2d in 3d lib, like nSprite 2 or sprite candy.

You could also try the fast image lib, detailed in the blitz3d user lib part of the forum.

You can always use sprites in 3D like sprite candy does.

okay thanks for clearing that up. :)

Well not really in real-time, but there is always a fast scaling routine. Just that nobody would use it anymore since you can get cycle speed using the 3D Hardware.

Sorry, i agree. I though that said rotate for some reason...

Anyway, copyrect can produce a decent sclaing, and pretty fast too!

how do you scale with copyrect I could never figure that out?

You can scale with copyrect? o_O

I`d be interested in knowing how this is done too.

Jason.

okay Ross C Out with the secret! there seem to be a lot of people besides me who didn't know you could do this. :) I also couldn't find it in the code archives :(

found the code for copyrect scaling

; -------------------------------------------------------------------------------------------------------------------------------------
; This function scales an image an arbitrary amount on the X and Y axis, and returns a pointer to the new image.
; The original image is not modified.
;
; The scale can either be a relative width and height, ie, 0.5 of the width of the original image, or it can be an exact size in pixels.
; If an exact size is desired, set ExactSize to true.
;
; This function is 80x faster than the ScaleImage function that comes with Blitz! 
; -------------------------------------------------------------------------------------------------------------------------------------
Function ScaleImageFast(SrcImage, ScaleX#, ScaleY#, ExactSize=False)

	Local SrcWidth,  SrcHeight
	Local DestWidth, DestHeight
	Local ScratchImage, DestImage
	Local SrcBuffer, ScratchBuffer, DestBuffer
	Local X1, Y1, X2, Y2
	
	; Get the width and height of the source image. 	
		SrcWidth  = ImageWidth(SrcImage)
		SrcHeight = ImageHeight(SrcImage)

	; Calculate the width and height of the dest image, or the scale.
		If ExactSize = False
	
			DestWidth  = Floor(SrcWidth  * ScaleX#)
			DestHeight = Floor(SrcHeight * ScaleY#)
	
		Else
	
			DestWidth  = ScaleX#
			DestHeight = ScaleY#

			ScaleX# = Float(DestWidth)  / Float(SrcWidth)
			ScaleY# = Float(DestHeight) / Float(SrcHeight)
	
		EndIf			

	; If the image does not need to be scaled, just copy the image and exit the function.
		If (SrcWidth = DestWidth) And (SrcHeight = DestHeight) Then Return CopyImage(SrcImage)

	; Create a scratch image that is as tall as the source image, and as wide as the destination image.
		ScratchImage = CreateImage(DestWidth, SrcHeight, 1, 1)
				
	; Create the destination image.
		DestImage = CreateImage(DestWidth, DestHeight, 1, 1) 

	; Get pointers to the image buffers.
		SrcBuffer     = ImageBuffer(SrcImage)
		ScratchBuffer = ImageBuffer(ScratchImage)
		DestBuffer    = ImageBuffer(DestImage)

	; Duplicate columns from source image to scratch image.
		For X2 = 0 To DestWidth-1
			X1 = Floor(X2 / ScaleX#)
			CopyRect X1, 0, 1, SrcHeight, X2, 0, SrcBuffer, ScratchBuffer
		Next
			
	; Duplicate rows from scratch image to destination image.
		For Y2 = 0 To DestHeight-1
			Y1 = Floor(Y2 / ScaleY#)
			CopyRect 0, Y1, DestWidth, 1, 0, Y2, ScratchBuffer, DestBuffer
		Next
						
	; Free the scratch image.
		FreeImage ScratchImage					
						
	; Return the new image.
		Return DestImage
					
End Function	


:)

Cool, thanks. That`s a great tip to know for the future.

Jason.

That's the one! It works by copying a line of pixels, into two lines of pixels. Then it copys in the other direction, downwards. I'm sure that's how it works :o)