Here's a function to scale an image fast. It's much faster than the built in function, and accurate. Also it should be twice as fast as the version I have in the code archives due to changing a single flag on the scratch image.
; -------------------------------------------------------------------------------------------------------------------------------------
; 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
|