To: | <> |
---|---|
Subject: | Re: [ts-7000] framebuffer to bmp |
From: | "Charlie Wallace" <> |
Date: | Thu, 11 Dec 2008 11:25:31 -0800 |
Its a fairly standard format really, its just RGB
565.
you can save it out as a tga by just outputting a
TGA header, and slapping the data from the framebuffer directly afterwards, you
don't even have to expand it like i'm doing here, but this just makes it simple,
this won't compile as-is, but it ought to get you going, i supplied both a
BMP and TGA, these are just debug functions for me as i ended up going to a
different method because i ran into so many structure packing problems on
different compilers, so they're in a controlled environment and fixed output
type, i pulled out the bits of code that look like they were needed, they're
from inside a class so there might be some missing items, width, framebuffer
pointer, but easy enough to add.
#define PACKED
# define GCC_PACK __attribute__((__packed__)
targa version
here's the header, made sure its set to not
pad.
/// this is being phased out due to packing issues see TGAImage instead typedef PACKED struct tgaImageHeader_tag { /* Offset Meaning */ PACKED byte IdSize; /* 0 id field size at end of header */ PACKED byte ColMapType; /* 1 0=>no color map, 1=>color map */ PACKED byte TypeCode; /* 2 1=>type 1, 2=>type 2 images,... */ PACKED word ColMapOrigin; /* 3 index of first color map entry */ PACKED word ColMapLength; /* 5 number of entries in color map */ PACKED byte ColMapBits; /* 7 number of bits/color map entry */ PACKED word XOrigin; /* 8 lower left corner of image */ PACKED word YOrigin; /* 10 lower left corner of image */ PACKED word Width; /* 12 width of image in pixels */ PACKED word Height; /* 14 height of image in pixels */ PACKED byte BitsPerPixel; /* 16 see note 1: below */ PACKED byte Descriptor; /* 17 see note 2: below */ PACKED byte FMield[256]; /* 18 image identification field */ /* */ /* Note 1: The "BitsPerPixel" field depends of the type of */ /* Targa file. For Targa type 1 images, it is the */ /* number of bits per pixel index. For a true- */ /* color Targa image this is 24, since pixels need */ /* 1 byte each for r, g, and b. */ /* Note 2: Individual bits have meaning here. For example, */ /* toggling bit 5 flips the image upside down. */} GCC_PACK tgaImageHeader;
typedef unsigned short tRGB; /** * Split a 565 RGB tuple to individual components 888 * * @param rgb - 565 value to split * @param *r - pointer to 8 bit R storage * @param *g - pointer to 8 bit G storage * @param *b - pointer to 8 bit B storage * * @returns - none */ void SplitRGB565(tRGB rgb , unsigned char *r, unsigned char *g, unsigned char *b ){ int ir,ig,ib; ir = ( rgb & ( 0x1f << 11 ) ) >> 11; ig = ( rgb & ( 0x3f << 5 ) ) >> 5; ib = rgb & 0x1f ;* r = ir << 3 ; *g = ig << 2 ; *b = ib << 3 ; return ;} inline tRGB Peek(int x,int y ) { return *(m_FrameBuffer + x + ( y * m_width ) );}; /** * Save a framebuffer to 24 TGA file (currently expects 565 framebuffer) * * @param name - save filename * @param w - width * @param h - height * @param ptr - pointer to framebuffer to save * * @return none * * @todo convert to allow any framebuffer style */ void fm_Display::WriteTGA( const char *filename, int w,int h,void *ptr){ tgaImageHeader tgaHeader; int j; char name[512]; fm_prolog( FM_PRI_LOW,"WriteTGA"); fm_strcpy( name, filename ); fm_strcat( name, ".tga"); fm_assert( name ); fm_assert( ptr ); tgaHeader.IdSize = 0; tgaHeader.ColMapType = 0; tgaHeader.TypeCode = 2; tgaHeader.ColMapOrigin = 0; tgaHeader.ColMapLength = 0; tgaHeader.ColMapBits = 0; tgaHeader.XOrigin = 0; tgaHeader.YOrigin = 0; tgaHeader.Width = w; tgaHeader.Height = h; tgaHeader.BitsPerPixel = 24; tgaHeader.Descriptor = 1<<5; unsigned char *ch; ch = (unsigned char *) fmMALLOC( ( w * h ) * 3 ); if( ch == FM_NULL ) return; int x,y; FM_FILE *fp = ::fm_fopen( name, "wb" ); if( fp ) { j = 0; for( y=0 ; y < h ; y++ ){ for( x=0 ; x < w ; x++ ){ unsigned char r,g,b; tRGB rgb ; rgb = Peek(x,y); // Read pixel and convert from 565 to 888 RGB SplitRGB565( rgb , &r,&g,&b ); ch[j++] = b ; ch[j++] = g ; ch[j++] = r ;} } :: fm_fwrite((void*)&tgaHeader,sizeof(tgaImageHeader)-256,1,fp);:: fm_fwrite( &ch[0], (w*h)*3,1,fp);:: fm_fclose( fp );} fm_free( ch );} //////////////////////////////////////////////////////////////////////////////////////////// BMP version #define BMP_HEADER_SIZE ( 54 )int WriteBMP( const char *filename, int width, int height,void *data ){ unsigned char *buf = (unsigned char *)data; char name[512]; fm_strcpy( name, filename ); fm_strcat( name, ".bmp"); unsigned char h[ BMP_HEADER_SIZE ]; FM_FILE *fp; int i; int line_bytes; line_bytes = (( width * 2 + 2 ) / 4 ) * 4; for ( i = 0; i < BMP_HEADER_SIZE; i++ ) { h[ i ] = 0; } h[ 0 ] = 'B'; h[ 1 ] = 'M'; *( int * )( h + 2 ) = ( int )( line_bytes * height * 2 + BMP_HEADER_SIZE ); *( int * )( h + 10 ) = ( int ) BMP_HEADER_SIZE; *( int * )( h + 14 ) = ( int ) BMP_HEADER_SIZE - 14; *( int * )( h + 18 ) = ( int ) width; *( int * )( h + 22 ) = ( int ) height; *( short * )( h + 26 ) = ( short ) 1; *( short * )( h + 28 ) = ( short ) 16; if (( fp = fm_fopen( name, "wb" )) == FM_NULL ) { return ( -1 ); } fm_fwrite( h, 1, BMP_HEADER_SIZE, fp ); for ( i = height - 1; i >= 0; i-- ) { unsigned char dummy[ 3 ] = { 0, 0, 0 }; fm_fwrite( buf + width * 2 * i, 1, width * 2, fp ); if ( line_bytes - width * 2 > 0 ) { fm_fwrite( dummy, 1, line_bytes - width * 2, fp ); } } fm_fclose( fp ); return ( 0 ); } // > ts7390 to put into a document. I can easily capture the images from the > frame buffer using the technologic frame buffer utility. > However, they are in a nonstandard format. > I've found stuff people have done to convert TO the framebuffer > format, but so far have not seen anything for going the other direction. > > Anyone have any ideas? > > Thanks in advance > Larry > > > ------------------------------------ > > Yahoo! Groups Links > > <*> To visit your group on the web, go to: > http://groups.yahoo.com/group/ts-7000/ > > <*> Your email settings: > Individual Email | Traditional > > <*> To change settings online go to: > http://groups.yahoo.com/group/ts-7000/join > (Yahoo! ID required) > > <*> To change settings via email: > m("yahoogroups.com","ts-7000-digest");"> > m("yahoogroups.com","ts-7000-fullfeatured");"> > > <*> To unsubscribe from this group, send an email to: > m("yahoogroups.com","ts-7000-unsubscribe");"> > > <*> Your use of Yahoo! Groups is subject to: > http://docs.yahoo.com/info/terms/ > > > > __________ Information from ESET NOD32 Antivirus, version of virus signature database 3684 (20081211) __________ > > The message was checked by ESET NOD32 Antivirus. > > http://www.eset.com > > > __._,_.___
Your email settings: Individual Email|Traditional
Change settings via the Web (Yahoo! ID required) Change settings via email: =Email Delivery: Digest | m("yahoogroups.com?subject","ts-7000-fullfeatured");=Change Delivery Format: Fully Featured">Switch to Fully Featured Visit Your Group | Yahoo! Groups Terms of Use | =Unsubscribe __,_._,___ |
<Prev in Thread] | Current Thread | [Next in Thread> |
---|---|---|
|
Previous by Date: | [ts-7000] Re: framebuffer to bmp, PeterElliot |
---|---|
Next by Date: | Re: [ts-7000] framebuffer to bmp, Larry |
Previous by Thread: | [ts-7000] Re: framebuffer to bmp, PeterElliot |
Next by Thread: | Re: [ts-7000] framebuffer to bmp, Larry |
Indexes: | [Date] [Thread] [Top] [All Lists] |
Disclaimer: Neither Andrew Taylor nor the University of NSW School of Computer and Engineering take any responsibility for the contents of this archive. It is purely a compilation of material sent by many people to the birding-aus mailing list. It has not been checked for accuracy nor its content verified in any way. If you wish to get material removed from the archive or have other queries about the archive e-mail Andrew Taylor at this address: andrewt@cse.unsw.EDU.AU