Code archives/Graphics/Fast Image Resize

This code has been declared by its author to be Public Domain code.

Download source code

Fast Image Resize by jfk EO-111102005
Ever thought ResizeImage is slow? Relax, once again the day is saved thanks to the power puff g - ehrm thanks to Blitz3D :)
; yet another QUICK SCALE
; An example on how to use 3D Hardware to speed up scaling of 2D images.
; written by jfk of csp

; results: scaling a 1024*768 image to half the size was 
; 109 times faster than ResizeImage() with TFormFiter on
; 36 times faster than ResizeImage() with TFormFiter off

; There are some limits with this method:
; images may not be bigger than 1024*1024 prior scaling.
; images may not be bigger than the current Graphics Resolution after scaling.
; Resampling looks best when in 1024*768 screen resolution



Graphics3D 1024,768,32,2
;Graphics3D 800,600,32,2
;Graphics3D 640,480,32,2
SetBuffer BackBuffer()

; init myResizeImage(img,w,h)
Global myResizeCamera=CreateCamera() 
CameraProjMode myResizeCamera,0
Global myResizeQuad=CreateQuad()
Global myResizeTex=CreateTexture(1024,1024,256 Or 16 Or 32)
EntityTexture myResizeQuad,myResizeTex
EntityFX myResizeQuad,1
CameraRange myResizeCamera,.001,10
TranslateEntity myResizeCamera,(1.0/1024.0),-(1.0/1024.0),-1.0
EntityParent myResizeQuad,myResizeCamera,1
PositionEntity myResizeCamera,32000,16000,16000
; end of init myResizeImage(img,w,h)




;-------------------------- Demo:-------------------------------

TFormFilter 1
;test speed of blitzs built in scaling
img=LoadImage("testbmp.bmp") ; a test image, max 1024 * 1024 !

t1=MilliSecs()
ResizeImage img,ImageWidth(img)/2,ImageHeight(img)/2
t2=MilliSecs()
Cls:DrawBlock img,0,0
Text 0,580,"TFormFiler on, Blitz Scaling: "+(t2-t1)+" ms"
Flip()
WaitKey()
FreeImage img

;---------------------------------------------------------------

TFormFilter 0
;test speed of blitzs built in scaling (now with Filter off)
img=LoadImage("testbmp.bmp") 

t1=MilliSecs()
ResizeImage img,ImageWidth(img)/2,ImageHeight(img)/2
t2=MilliSecs()
Cls:DrawBlock img,0,0
Text 0,580,"TFormFiler off, Blitz Scaling: "+(t2-t1)+" ms"
Flip()
WaitKey()
FreeImage img

;---------------------------------------------------------------

; now test speed of faster scaling utilizing 3D Hardware
img=LoadImage("testbmp.bmp") 

t1=MilliSecs()
img=myResizeImage(img,ImageWidth(img)/2,ImageHeight(img)/2)
t2=MilliSecs()
Cls:DrawBlock img,0,0
Text 0,580,"3D Image Scaling: "+(t2-t1)+" ms"
Flip
WaitKey()




End





Function myResizeImage(img,w#,h#,cam0=0)
; img-handle, desired width and height, optional camera handle that may be deactivated during rescaling
; note: width and height may not be bigger than current Graphics resolution, or they will be clipped!
 img_w#=ImageWidth(img)
 img_h#=ImageHeight(img)
 If img_w>1024 Then img_w=1024
 If img_h>1024 Then img_h=1024
 If img_w<1 Then img_w=1
 If img_h<1 Then img_h=1

 If w>1024 Then w=1024
 If h>1024 Then h=1024
 If w<1 Then w=1
 If h<1 Then h=1

 w_rel#=w#/img_w#
 h_rel#=h#/img_h#
 g_rel#=1024.0/GraphicsWidth()

 CopyRect 0,0,img_w,img_h,512-(img_w/2.0),512-(img_h/2.0),ImageBuffer(img),TextureBuffer(myResizeTex)
 ScaleEntity myResizeQuad,w_rel*g_rel,h_rel*g_rel,0.0001
 If cam0<>0 Then CameraProjMode cam0,0
 CameraProjMode myResizeCamera,1
 RenderWorld()
 CameraProjMode myResizeCamera,0
 If cam0<>0 Then CameraProjMode cam0,1

 img2=CreateImage(w,h)
 CopyRect (GraphicsWidth()/2.0)-(w/2.0),(GraphicsHeight()/2.0)-(h/2.0),w,h,0,0,BackBuffer(),ImageBuffer(img2)
 FreeImage img
 Return img2
End Function



Function CreateQuad()
  ; creates a quad, facing to the -Z side
  mesh=CreateMesh()
  surf=CreateSurface(mesh)
  v0=AddVertex(surf, -1.0,   1.0,0, 0,0 )
  v1=AddVertex(surf,  1.0,   1.0,0, 1,0 )
  v2=AddVertex(surf,  1.0,  -1.0,0, 1,1 )
  v3=AddVertex(surf, -1.0,  -1.0,0, 0,1 )
  AddTriangle(surf,v0,v1,v2)
  AddTriangle(surf,v0,v2,v3)
  UpdateNormals mesh
  Return mesh
End Function

Comments

None.

Code Archives Forum