[bb] Save TGA 32 by Hulk [ 1+ years ago ]

Started by BlitzBot, June 29, 2017, 00:28:43

Previous topic - Next topic

BlitzBot

Title : Save TGA 32
Author : Hulk
Posted : 1+ years ago

Description : Original code from Skidracer

Save buffer to TGA 32, with or without alpha
Alpha was calculated by RGB sum, very nice..., very fast!


Code :
Code (blitzbasic) Select
; 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: est.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 :


Gabriel(Posted 1+ years ago)

 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-11110(Posted 1+ years ago)

 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.5it gives values between 0 and 1147. Id rather use:alpha#=(ir + ig +ib) / 3to 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 [/i]