Colores invertidos tft de 320x240. (solucionado)

Pues eso compañeros estoy volviéndome loquillo con los colores de este código,todo me sale al revés los colores el blanco negro,el amarillo de otro color etc,y subiendo fotos a la tft se ven las fotos como veladas y en blanco y negro,alguna sugerencia o saber que pasa por el código no se por donde cojerlo.

Gracias.

// Modified TFTbmp sketch from Adafruit_TFTLCD Library for
// TFT shield LCD 2.4" Chip ILI9341
// http://www.electronicavm.net
// @iPadNanito

#include <Adafruit_GFX.h>    // Libreria de graficos
#include <Adafruit_TFTLCD.h> // Libreria de LCD 
#include <SD.h>              // Libreria de tarjeta SD
#include <SPI.h>             // Libreria bus SPI 

#define LCD_CS A3   // Definimos los pines del LCD
#define LCD_CD A2   // para poder visualizar elementos graficos
#define LCD_WR A1
#define LCD_RD A0
#define LCD_RESET A4

// Los pines del puerto SPI vienen configurados por libreria, por lo que 
// solamente debemos colocar el pin correspondiente al Chip Select del
// bus SPI correspondiente a la conexion con la tarjeta SD
#define SD_CS 10  

// En la tarjeta SD debemos colocar imagenes en formato BMP de 24 Bits!
// Otro tipo de formato de imagen no se puede visualizar por pantalla. 

Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);  // Instancia LCD 

void setup()
{
  Serial.begin(9600); // Iniciamos el puerto serie para comprobar 
                      // la comunicacion con la tarjeta microSD
                      
  tft.reset();
  
  tft.begin(0x9341); // Iniciamos el LCD especificando el controlador ILI9341. 

  Serial.print(F("Inicializando tarjeta SD..."));
  
  if (!SD.begin(SD_CS)) // Si se produce un error al intentar acceder
  {                     // a la tarjeta SD, lo mostramos por el Serial Monitor
    Serial.println(F("Error!"));
    return;
  }
  Serial.println(F("OK!"));
  
}

void loop()
{
   tft.setRotation(5); // Establecemos la posicion de la pantalla Vertical
   
   bmpDraw("1.bmp", 0, 0); // Mostramos una imagen en las coordenadas 0,0
   
   delay(4500);
  
   tft.setRotation(5); // Establecemos la posicion de la pantalla Horizontal
   
   bmpDraw("2.bmp",0,0); // // Mostramos otra imagen en las coordenadas 0,0
   
   delay(6500);  
   
   tft.setRotation(5); // Establecemos la posicion de la pantalla Vertical
   
   bmpDraw("3.bmp", 0, 5); // Mostramos una imagen en las coordenadas 0,0
   
   delay(4500);
  
   tft.setRotation(5); // Establecemos la posicion de la pantalla Vertical
   
   bmpDraw("4.bmp", 0, 0); // Mostramos una imagen en las coordenadas 0,0
   
   delay(6000);
   
    tft.setRotation(5); // Establecemos la posicion de la pantalla Vertical
   
   bmpDraw("5.bmp", 0, 5); // Mostramos una imagen en las coordenadas 0,0
   
   delay(4500);
   
    tft.setRotation(5); // Establecemos la posicion de la pantalla Vertical
   
   bmpDraw("6.bmp", 0, 0); // Mostramos una imagen en las coordenadas 0,0
   
   delay(6000);
   
    tft.setRotation(5); // Establecemos la posicion de la pantalla Vertical
   
   bmpDraw("7.bmp", 0, 5); // Mostramos una imagen en las coordenadas 0,0
   
   delay(4500);
  
   tft.setRotation(5); // Establecemos la posicion de la pantalla Horizontal
   
   bmpDraw("8.bmp",0,0); // // Mostramos otra imagen en las coordenadas 0,0
   
   delay(6000);  
   
   tft.setRotation(5); // Establecemos la posicion de la pantalla Vertical
   
   bmpDraw("9.bmp", 0, 0); // Mostramos una imagen en las coordenadas 0,0
   
   delay(1000);
  
   tft.setRotation(5); // Establecemos la posicion de la pantalla Vertical
   
   bmpDraw("10.bmp", 0, 0); // Mostramos una imagen en las coordenadas 0,0
   
   delay(1000);
   
    tft.setRotation(5); // Establecemos la posicion de la pantalla Vertical
   
   bmpDraw("11.bmp", 0, 0); // Mostramos una imagen en las coordenadas 0,0
   
   delay(1000);
   
    tft.setRotation(5); // Establecemos la posicion de la pantalla Vertical
   
   bmpDraw("12.bmp", 0, 0); // Mostramos una imagen en las coordenadas 0,0
   
   delay(1000);
}

y aquí el resto del código,no se por que no me lo deja subir entero,juraria que e visto códigos mas largos que este.

// Esta funcion abre un archivo Windows bitmap (BMP) y lo muestra por 
// pantalla en las coordenadas especificadas. Se puede acelerar el 
// proceso de muestreo leyendo muchos pixeles a la vez en lugar de 
// leer pixel a pixel, incrementando el tamaño de la siguiente variable 
// BUFFPIXEL, utilizaremos mas memoria RAM del Arduino pero se realizará
// la carga de la imagen mas rapido.
// Un buffer de 20 pixeles es un valor equilibrado. 

#define BUFFPIXEL 20

void bmpDraw(char *filename, int x, int y) {

  File     bmpFile;
  int      bmpWidth, bmpHeight;   // W+H in pixels
  uint8_t  bmpDepth;              // Bit depth (currently must be 24)
  uint32_t bmpImageoffset;        // Start of image data in file
  uint32_t rowSize;               // Not always = bmpWidth; may have padding
  uint8_t  sdbuffer[3*BUFFPIXEL]; // pixel in buffer (R+G+B per pixel)
  uint16_t lcdbuffer[BUFFPIXEL];  // pixel out buffer (16-bit per pixel)
  uint8_t  buffidx = sizeof(sdbuffer); // Current position in sdbuffer
  boolean  goodBmp = false;       // Set to true on valid header parse
  boolean  flip    = true;        // BMP is stored bottom-to-top
  int      w, h, row, col;
  uint8_t  r, g, b;
  uint32_t pos = 0, startTime = millis();
  uint8_t  lcdidx = 0;
  boolean  first = true;

  if((x >= tft.width()) || (y >= tft.height())) return;

  Serial.println();
  Serial.print(F("Loading image '"));
  Serial.print(filename);
  Serial.println('\'');
  // Open requested file on SD card
  if ((bmpFile = SD.open(filename)) == NULL) {
    Serial.println(F("File not found"));
    return;
  }

  // Parse BMP header
  if(read16(bmpFile) == 0x4D42) { // BMP signature
    Serial.println(F("File size: ")); Serial.println(read32(bmpFile));
    (void)read32(bmpFile); // Read & ignore creator bytes
    bmpImageoffset = read32(bmpFile); // Start of image data
    Serial.print(F("Image Offset: ")); Serial.println(bmpImageoffset, DEC);
    // Read DIB header
    Serial.print(F("Header size: ")); Serial.println(read32(bmpFile));
    bmpWidth  = read32(bmpFile);
    bmpHeight = read32(bmpFile);
    if(read16(bmpFile) == 1) { // # planes -- must be '1'
      bmpDepth = read16(bmpFile); // bits per pixel
      Serial.print(F("Bit Depth: ")); Serial.println(bmpDepth);
      if((bmpDepth == 24) && (read32(bmpFile) == 0)) { // 0 = uncompressed

        goodBmp = true; // Supported BMP format -- proceed!
        Serial.print(F("Image size: "));
        Serial.print(bmpWidth);
        Serial.print('x');
        Serial.println(bmpHeight);

        // BMP rows are padded (if needed) to 4-byte boundary
        rowSize = (bmpWidth * 3 + 3) & ~3;

        // If bmpHeight is negative, image is in top-down order.
        // This is not canon but has been observed in the wild.
        if(bmpHeight < 0) {
          bmpHeight = -bmpHeight;
          flip      = false;
        }

        // Crop area to be loaded
        w = bmpWidth;
        h = bmpHeight;
        if((x+w-1) >= tft.width())  w = tft.width()  - x;
        if((y+h-1) >= tft.height()) h = tft.height() - y;

        // Set TFT address window to clipped image bounds
        tft.setAddrWindow(x, y, x+w-1, y+h-1);

        for (row=0; row<h; row++) { // For each scanline...
          // Seek to start of scan line.  It might seem labor-
          // intensive to be doing this on every line, but this
          // method covers a lot of gritty details like cropping
          // and scanline padding.  Also, the seek only takes
          // place if the file position actually needs to change
          // (avoids a lot of cluster math in SD library).
          if(flip) // Bitmap is stored bottom-to-top order (normal BMP)
            pos = bmpImageoffset + (bmpHeight - 1 - row) * rowSize;
          else     // Bitmap is stored top-to-bottom
            pos = bmpImageoffset + row * rowSize;
          if(bmpFile.position() != pos) { // Need seek?
            bmpFile.seek(pos);
            buffidx = sizeof(sdbuffer); // Force buffer reload
          }

          for (col=0; col<w; col++) { // For each column...
            // Time to read more pixel data?
            if (buffidx >= sizeof(sdbuffer)) { // Indeed
              // Push LCD buffer to the display first
              if(lcdidx > 0) {
                tft.pushColors(lcdbuffer, lcdidx, first);
                lcdidx = 0;
                first  = false;
              }
              bmpFile.read(sdbuffer, sizeof(sdbuffer));
              buffidx = 0; // Set index to beginning
            }

            // Convert pixel from BMP to TFT format
            b = sdbuffer[buffidx++];
            g = sdbuffer[buffidx++];
            r = sdbuffer[buffidx++];
            lcdbuffer[lcdidx++] = tft.color565(r,g,b);
          } // end pixel
        } // end scanline
        // Write any remaining data to LCD
        if(lcdidx > 0) {
          tft.pushColors(lcdbuffer, lcdidx, first);
        } 
        Serial.print(F("Loaded in "));
        Serial.print(millis() - startTime);
        Serial.println(" ms");
      } // end goodBmp
    }
  }

  bmpFile.close();
  if(!goodBmp) Serial.println(F("BMP format not recognized."));
}

// These read 16- and 32-bit types from the SD card file.
// BMP data is stored little-endian, Arduino is little-endian too.
// May need to reverse subscript order if porting elsewhere.

uint16_t read16(File f) {
  uint16_t result;
  ((uint8_t *)&result)[0] = f.read(); // LSB
  ((uint8_t *)&result)[1] = f.read(); // MSB
  return result;
}

uint32_t read32(File f) {
  uint32_t result;
  ((uint8_t *)&result)[0] = f.read(); // LSB
  ((uint8_t *)&result)[1] = f.read();
  ((uint8_t *)&result)[2] = f.read();
  ((uint8_t *)&result)[3] = f.read(); // MSB
  return result;
}

Vaya por delante que lo mismo digo algún disparate, pero en la línea que pones:

lcdbuffer[lcdidx++] = tft.color565(r,g,b);

¿Podrías probar lcdbuffer[lcdidx++] = tft.color565(255-r,255-g,255-b); ? A veces el fallo está en lo más simple.

Muchas gracias Xtrem3 ya lo e soluciado gracias a tú colaboración.

Un saludo.

Hola, es un poco tarde. Pero yo tuve este problema con los colores, y lo solucione haciendo la inversa lógica en binario utilizando "=~" algo así: /* // Color definitions

define BLACK 0x0000

define BLUE 0x001F

define RED 0xF800

define GREEN 0x07E0

define CYAN 0x07FF

define MAGENTA 0xF81F

define YELLOW 0xFFE0

define WHITE 0xFFFF

*/ //ANULÉ LOS ANTERIORES int BLACK =~0x0000; int BLUE =~ 0x001F;

y así con cada uno. espero que te sirva.

Por favor edita tu ultimo post para que el código se lee apropiadamente como indican las normas o sea usando etiqutas como se ve mas arriba.
Además no respondas hilos de mas de 120 dias a menos que seas el autor del problema.
Entiendo que quieres ayudar pero lo mejor siempre es crear un hilo nuevo y poner la solucion referenciando a esta.