Code archives/File Utilities/Save TGA 32

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

Download source code

Save TGA 32 by Hulk2004
Original code from Skidracer

Save buffer to TGA 32, with or without alpha
Alpha was calculated by RGB sum, very nice..., very fast!
; ID: 1
; Author: skidracer
; Date: 2001-08-16 16:24:30
; Title: SaveTGA
; Description: save texture in TGA format
;
; Addition coding HULK on 12/2004
; Description: save buffer to TGA format
; flag: pix_depth=24 no alpha save
;       pix_depth=32 save alpha from rgb sum ;nice!


Graphics3D 640,480,32,2
SetBuffer FrontBuffer()

;**************************************************************
; MISC STUFF
camera%=CreateCamera()

PositionEntity camera,0,0,-10

Dim p(100)
For a=1 To 100
	p(a)=CreateSprite()
	EntityAlpha p(a),Rnd(.1,.5)
	EntityColor p(a),Rnd(255),Rnd(255),Rnd(255)
	PositionEntity p(a),Rnd(-10,10),Rnd(-10,10),Rnd(0,10)
Next

RenderWorld()
Color 255,0,0
Rect 0,0,640,480,0
WaitKey()
;**************************************************************

Save_buffer_tga("c:\test.tga",FrontBuffer(),640,480,32)
End





Function Save_buffer_TGA(name$,buffer%,sx%,sy%,pix_depth%=24)
    Local f,width%,height%,x%,y%
    width=sx
    height=sy
    f=WriteFile(name$)
    WriteByte(f,0) ;idlength
    WriteByte(f,0) ;colormaptype
    WriteByte(f,2) ;imagetype 2=rgb
    WriteShort(f,0) ;colormapindex
    WriteShort(f,0) ;colormapnumentries
    WriteByte(f,0) ;colormapsize 
    WriteShort(f,0) ;xorigin
    WriteShort(f,0) ;yorigin
    WriteShort(f,width) ;width
    WriteShort(f,height) ;height
    WriteByte(f,32) ;pixsize
    WriteByte(f,8) ;attributes

    LockBuffer buffer
	For y=height-1 To 0 Step -1
        For x=0 To width-1

			If pix_depth=24
				pix%=ReadPixelFast(x,y,buffer)
				WriteInt f,pix
			Else
				pix%=(ReadPixelFast(x,y,buffer) Shl 8) Shr 8

				ir%=((pix Shr 16) And $00ff)
				ig%=((pix Shr 8) And $00ff)	
				ib%=((pix And $00ff))
				
				alpha#=(ir + ig +ib) * 1.5		;1.5 alpha power based on rgb sum :) 1.5, 1.7, 1.9 increase visibility but decrease alpha
				
				If alpha>255 Then alpha=255
				
				WriteInt f,( alpha Shl 24 ) Or pix
			EndIf      
			
        Next
    Next
    CloseFile f
	UnlockBuffer buffer
End Function

Comments

Gabriel2005
Doesn't seem to successfully save the alpha from a texture. I tried your function and just got opaque white where the alpha should have been and anything that had >0.0 and <1.0 alpha was written as 0.0 alpha.

I replaced your function with SkidRacer's original and it worked perfectly.


jfk EO-111102005
This may be wrong:

ir%=((pix Shr 16) And $00ff)
ig%=((pix Shr 8) And $00ff)
ib%=((pix And $00ff))

alpha#=(ir + ig +ib) * 1.5

it gives values between 0 and 1147. Id rather use:

alpha#=(ir + ig +ib) / 3

to get the exact brightness alpha value, or maybe something like
ir#=((pix Shr 16) And $00ff)
ig#=((pix Shr 8) And $00ff)
ib3=((pix And $00ff))

alpha#=(ir^2 + ig^2 +ib^2) /16
If alpha>255 Then alpha=255

To get some kind of nonlinear transparency


Code Archives Forum