C++存储tga图片

    技术2022-05-20  60

    网上有很多关于TGA图片读取的代码,但是还没有相关的存储代码,工作需要,自己写了一个。

    工作只要求到写32位,未压缩的,RGBA颜色格式的图片,所以channels没有设置参数,我这里默认是4了

     

    _void SaveTGA( const _char *filename, _dword width, _dword height, const _byte *data )

    {

    // 自定义写数据类型

    typedef unsigned char _pixel;

    // 打开文件

    FILE *savefile = fopen(filename, "wb");

     

    // set to {0,0,2,0,0,0,0,0,0,0,0,0} uncompressed tga,我只写未压缩的tga

    _pixel type_header[12] =  {0,0,2,0,0,0,0,0,0,0,0,0};

    fwrite(  type_header,12*sizeof( _pixel  ),1,savefile );

     

    _pixel header[6];

    header[0] = width % 256; //图片width 的 lowbyte

    header[1] = width / 256; //图片width 的 highbyte

    header[2] = height % 256; //图片height 的 lowbyte

    header[3] = height / 256; //图片height的 highbyte

    header[4] = 32; //位深

    header[5] = 8; //每种颜色的位深

     

    fwrite( header, 6*sizeof( _pixel ),1,savefile );

     

    unsigned int image_size= 4*width*height;

    // capy data

    _pixel * invert_data = new _pixel [image_size];

    memset( invert_data,0,image_size*sizeof( _pixel ) );

    for( unsigned int i=0; i<image_size; i++ )

    {

    invert_data[ i ]  = data[ i ];

    }

    // Swap red and blue,RGB转为BGR

    for ( unsigned int cswap = 0; cswap < image_size; cswap += 4 )

    {

    _pixel r = invert_data[cswap];

    invert_data[cswap] = invert_data[cswap + 2];

    invert_data[cswap + 2] = r;

    }

     

    fwrite( invert_data,image_size*sizeof( _pixel ),1,savefile );

     

    delete invert_data;

     

    fclose( savefile );

    }

     


    最新回复(0)