<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Convert Windows BMP (24bpp-BGR) to TFT (16bpp-RGB) in LPC Microcontrollers</title>
    <link>https://community.nxp.com/t5/LPC-Microcontrollers/Convert-Windows-BMP-24bpp-BGR-to-TFT-16bpp-RGB/m-p/514886#M915</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by Ex-Zero on Sun Jan 01 06:16:19 MST 2012&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Playing with SWIM I was trying to load a simple 480x272 Windows BMP file from SD. Wasn't too difficult (with EA SD sample) to load a 24bpp file to SDRAM.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;But SWIM is expecting 16bpp, so a conversion is needed. Picture data (width, height, picture data offset) are stored in BMP file and can be read there via offset as shown below:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;lt;code&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;//DRAM 2M Words x 32 Bits x 4 Banks (256-MBIT)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;//at 0xA000 0000 - 0xA1FF FFFF range = 0x0200 0000&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define SDRAM_FRAME (SDRAM_BASE+0x10000)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define SDRAM_PIC&amp;nbsp;&amp;nbsp; (SDRAM_BASE+0x800000)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define SDRAM_RAW&amp;nbsp;&amp;nbsp; (SDRAM_BASE+0x1000000)&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;/***********************************************************************&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * Function: draw_picture&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; *&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * Purpose:&amp;nbsp; read Windows BMP (24bpp GBR) from SD and draw it (480x272)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; *&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * Parameters:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; *&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; win&amp;nbsp; : Window identifier&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; *&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; filename : filename &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; *&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * Outputs: None&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; *&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * Returns: Nothing&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; *&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * Notes: this function is reading original 24bpp GBR files (Windows)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; *&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; **********************************************************************/&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;static int draw_picture(SWIM_WINDOW_T *win, const char * filename)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; uint8_t *raw24_ptr;//pointer to reading 24bpp BGR&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; COLOR_T *pic_ptr;//pointer to writing 16bpp RGB565&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; uint16_t p_col;//color bits&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; uint32_t p_off;//data offset&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; uint32_t p_w;//picture width&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; uint32_t p_h;//picture height&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;//set picture pointer pointer&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; pic_ptr = (COLOR_T *)SDRAM_PIC;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; raw24_ptr = (uint8_t *)SDRAM_RAW;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; swim_set_pen_color(win,BLACK);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; res = f_open (&amp;amp;file, filename, FA_READ);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; if (res)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; sprintf(buff, "Failed to open ip.txt: %d \n", res);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; swim_put_text(win,(const char*)&amp;amp;buff);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; return 0;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;//read image&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; res = f_read (&amp;amp;file,(void*)raw24_ptr,Finfo.fsize, &amp;amp;numRead);/* Read data from a file */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; if (res || numRead &amp;lt;= 0)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; sprintf(buff, "Failed to read file: %d \n", res);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; swim_put_text(win,(const char*)&amp;amp;buff);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; return 0;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; sprintf(buff, "Read %d bytes\n",numRead);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;// swim_put_text(win,(const char*)&amp;amp;buff);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;// swim_put_text(win,(const char*)"Closing file\n");&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; res =&amp;nbsp; f_close (&amp;amp;file);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; if (res)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; sprintf(buff, "Failed to close new.txt: %d \n", res);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; swim_put_text(win,(const char*)&amp;amp;buff);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; return 0;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; raw24_ptr =(uint8_t *)SDRAM_RAW;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; p_off = *(uint16_t*)(raw24_ptr +0x0A);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; p_w = *(uint32_t*)(raw24_ptr +0x12);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; p_h = *(uint32_t*)(raw24_ptr +0x16);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; p_col = *(uint16_t*)(raw24_ptr +0x1C);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; sprintf(buff, "Offset %d\nWidth %d - Height %d - Color %d\n",p_off,p_w,p_h,p_col);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;// swim_put_text(win,(const char*)&amp;amp;buff);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; raw24_ptr += p_off;//set pointer to data offset&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt; pic_ptr = (COLOR_T *)SDRAM_PIC;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt; convert24to16(raw24_ptr,pic_ptr,p_w,p_h);&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt; pic_ptr = (COLOR_T *)SDRAM_PIC;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;//clear screen if necessary&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;// swim_clear_screen(win,BLACK);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;//put image&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; swim_put_image(win,pic_ptr,p_w,p_h);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; return 1;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;lt;/code&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Conversion is more than just changing size and color order. Mirroring must be done also:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;lt;code&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;/***********************************************************************&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * Function: convert24to16&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; *&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * Purpose:&amp;nbsp; convert Windows BMP (24bpp GBR) to 16bpp 565 RGB&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; *&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * Parameters:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; *&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; read_buffer : read from bmp data buffer (uint8) = bmp-file + data_offset&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; *&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; write_buffer: write to picture buffer (uint16)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; *&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; width&amp;nbsp;&amp;nbsp; : picture width&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; *&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; height&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : picture height&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; *&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * Outputs: None&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; *&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * Returns: Nothing&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; *&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * Notes: this function is also changing byte order to avoid&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; *&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; wrong 'mirroring' of pictures&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; *&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; **********************************************************************/&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;static void convert24to16(uint8_t* read_buffer,uint16_t* write_buffer,uint32_t width,uint32_t height)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; uint32_t p_x;//picture x position&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; uint32_t p_y;//picture y position&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; write_buffer += (width*height)-1-width;//start at last line&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; //read 24bit BGR to 16bit RGB&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; for(p_y=0;p_y&amp;lt;height;p_y++)//y = lines = height&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; for(p_x=0;p_x&amp;lt;width;p_x++)//x = pixel = width&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; //convert 3 byte data BGR (Windows BMP) to 2 byte data RBG 565&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; *write_buffer = (*read_buffer &amp;amp; 0xF8)&amp;gt;&amp;gt;3;//read upper 5 bits blue&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; read_buffer++;//next color byte&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; *write_buffer |=((*read_buffer &amp;amp;0xFC)&amp;lt;&amp;lt;3);//read upper 6 bits green&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; read_buffer++;//next color byte&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; *write_buffer |=((*read_buffer &amp;amp; 0xF8)&amp;lt;&amp;lt;8);//add upper 5 bits red&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; write_buffer++;//next picture int&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; read_buffer++;//next color byte&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; }//end pixel&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; write_buffer-= 2*width;//2 lines back&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; }//end line&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;}//end function&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;lt;/code&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Now BMP files from SD card can be shown:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;lt;iframe width="420" height="315" src="&lt;/SPAN&gt;&lt;A class="jive-link-external-small" href="https://community.nxp.com/external-link.jspa?url=http%3A%2F%2Fwww.youtube.com%2Fembed%2FrjQXyU5zlnQ" rel="nofollow" target="_blank"&gt;http://www.youtube.com/embed/rjQXyU5zlnQ&lt;/A&gt;&lt;SPAN&gt;" frameborder="0" allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Wed, 15 Jun 2016 17:16:00 GMT</pubDate>
    <dc:creator>lpcware</dc:creator>
    <dc:date>2016-06-15T17:16:00Z</dc:date>
    <item>
      <title>Convert Windows BMP (24bpp-BGR) to TFT (16bpp-RGB)</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/Convert-Windows-BMP-24bpp-BGR-to-TFT-16bpp-RGB/m-p/514886#M915</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by Ex-Zero on Sun Jan 01 06:16:19 MST 2012&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Playing with SWIM I was trying to load a simple 480x272 Windows BMP file from SD. Wasn't too difficult (with EA SD sample) to load a 24bpp file to SDRAM.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;But SWIM is expecting 16bpp, so a conversion is needed. Picture data (width, height, picture data offset) are stored in BMP file and can be read there via offset as shown below:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;lt;code&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;//DRAM 2M Words x 32 Bits x 4 Banks (256-MBIT)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;//at 0xA000 0000 - 0xA1FF FFFF range = 0x0200 0000&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define SDRAM_FRAME (SDRAM_BASE+0x10000)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define SDRAM_PIC&amp;nbsp;&amp;nbsp; (SDRAM_BASE+0x800000)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define SDRAM_RAW&amp;nbsp;&amp;nbsp; (SDRAM_BASE+0x1000000)&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;/***********************************************************************&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * Function: draw_picture&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; *&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * Purpose:&amp;nbsp; read Windows BMP (24bpp GBR) from SD and draw it (480x272)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; *&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * Parameters:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; *&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; win&amp;nbsp; : Window identifier&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; *&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; filename : filename &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; *&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * Outputs: None&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; *&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * Returns: Nothing&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; *&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * Notes: this function is reading original 24bpp GBR files (Windows)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; *&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; **********************************************************************/&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;static int draw_picture(SWIM_WINDOW_T *win, const char * filename)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; uint8_t *raw24_ptr;//pointer to reading 24bpp BGR&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; COLOR_T *pic_ptr;//pointer to writing 16bpp RGB565&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; uint16_t p_col;//color bits&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; uint32_t p_off;//data offset&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; uint32_t p_w;//picture width&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; uint32_t p_h;//picture height&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;//set picture pointer pointer&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; pic_ptr = (COLOR_T *)SDRAM_PIC;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; raw24_ptr = (uint8_t *)SDRAM_RAW;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; swim_set_pen_color(win,BLACK);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; res = f_open (&amp;amp;file, filename, FA_READ);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; if (res)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; sprintf(buff, "Failed to open ip.txt: %d \n", res);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; swim_put_text(win,(const char*)&amp;amp;buff);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; return 0;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;//read image&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; res = f_read (&amp;amp;file,(void*)raw24_ptr,Finfo.fsize, &amp;amp;numRead);/* Read data from a file */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; if (res || numRead &amp;lt;= 0)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; sprintf(buff, "Failed to read file: %d \n", res);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; swim_put_text(win,(const char*)&amp;amp;buff);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; return 0;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; sprintf(buff, "Read %d bytes\n",numRead);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;// swim_put_text(win,(const char*)&amp;amp;buff);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;// swim_put_text(win,(const char*)"Closing file\n");&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; res =&amp;nbsp; f_close (&amp;amp;file);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; if (res)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; sprintf(buff, "Failed to close new.txt: %d \n", res);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; swim_put_text(win,(const char*)&amp;amp;buff);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; return 0;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; raw24_ptr =(uint8_t *)SDRAM_RAW;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; p_off = *(uint16_t*)(raw24_ptr +0x0A);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; p_w = *(uint32_t*)(raw24_ptr +0x12);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; p_h = *(uint32_t*)(raw24_ptr +0x16);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; p_col = *(uint16_t*)(raw24_ptr +0x1C);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; sprintf(buff, "Offset %d\nWidth %d - Height %d - Color %d\n",p_off,p_w,p_h,p_col);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;// swim_put_text(win,(const char*)&amp;amp;buff);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; raw24_ptr += p_off;//set pointer to data offset&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt; pic_ptr = (COLOR_T *)SDRAM_PIC;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt; convert24to16(raw24_ptr,pic_ptr,p_w,p_h);&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt; pic_ptr = (COLOR_T *)SDRAM_PIC;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;//clear screen if necessary&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;// swim_clear_screen(win,BLACK);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;//put image&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; swim_put_image(win,pic_ptr,p_w,p_h);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; return 1;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;lt;/code&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Conversion is more than just changing size and color order. Mirroring must be done also:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;lt;code&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;/***********************************************************************&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * Function: convert24to16&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; *&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * Purpose:&amp;nbsp; convert Windows BMP (24bpp GBR) to 16bpp 565 RGB&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; *&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * Parameters:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; *&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; read_buffer : read from bmp data buffer (uint8) = bmp-file + data_offset&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; *&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; write_buffer: write to picture buffer (uint16)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; *&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; width&amp;nbsp;&amp;nbsp; : picture width&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; *&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; height&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : picture height&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; *&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * Outputs: None&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; *&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * Returns: Nothing&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; *&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * Notes: this function is also changing byte order to avoid&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; *&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; wrong 'mirroring' of pictures&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; *&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; **********************************************************************/&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;static void convert24to16(uint8_t* read_buffer,uint16_t* write_buffer,uint32_t width,uint32_t height)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; uint32_t p_x;//picture x position&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; uint32_t p_y;//picture y position&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; write_buffer += (width*height)-1-width;//start at last line&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; //read 24bit BGR to 16bit RGB&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; for(p_y=0;p_y&amp;lt;height;p_y++)//y = lines = height&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; for(p_x=0;p_x&amp;lt;width;p_x++)//x = pixel = width&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; //convert 3 byte data BGR (Windows BMP) to 2 byte data RBG 565&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; *write_buffer = (*read_buffer &amp;amp; 0xF8)&amp;gt;&amp;gt;3;//read upper 5 bits blue&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; read_buffer++;//next color byte&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; *write_buffer |=((*read_buffer &amp;amp;0xFC)&amp;lt;&amp;lt;3);//read upper 6 bits green&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; read_buffer++;//next color byte&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; *write_buffer |=((*read_buffer &amp;amp; 0xF8)&amp;lt;&amp;lt;8);//add upper 5 bits red&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; write_buffer++;//next picture int&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; read_buffer++;//next color byte&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; }//end pixel&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; write_buffer-= 2*width;//2 lines back&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; }//end line&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;}//end function&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;lt;/code&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Now BMP files from SD card can be shown:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;lt;iframe width="420" height="315" src="&lt;/SPAN&gt;&lt;A class="jive-link-external-small" href="https://community.nxp.com/external-link.jspa?url=http%3A%2F%2Fwww.youtube.com%2Fembed%2FrjQXyU5zlnQ" rel="nofollow" target="_blank"&gt;http://www.youtube.com/embed/rjQXyU5zlnQ&lt;/A&gt;&lt;SPAN&gt;" frameborder="0" allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 17:16:00 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/Convert-Windows-BMP-24bpp-BGR-to-TFT-16bpp-RGB/m-p/514886#M915</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T17:16:00Z</dc:date>
    </item>
  </channel>
</rss>

