banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

GEODATA DAYS 2024

#1 Wed 07 July 2010 14:46

filth
Juste Inscrit !
Date d'inscription: 7 Jul 2010
Messages: 1

API C GDAL : RGBA4_4_4_4 et transparence

Bonjour

Avec le code en bas du post, j'arrive à créer une image tiff  encodé en RGBA 32 bits
Je rencontre quelques problèmes pour passer en RGBA4_4_4_4
J'arrive bien a avoir une image mais je n'ai plus de transparence
J'ai l'impression que sur mes 4 bandes il y en a 3 qui servent pour les couleurs RGB et la 4ème n'affiche
que du noir.

Je sais deja qu'il faut modifier l'options NBITS et la passer à 4
papszOptions = CSLAddString(papszOptions, "NBITS=4");

Il me semble aussi que les couleurs sont inversées c'est à dire que la bande1 ne correspond plus au rouge
mais ca c'est un autre probleme.

Je passe un octet et non pas 4bits par couleur est ce correct ? J'ai cru voir dans un autre post que GDal faisait en interne la conversion
Savez vous quels autres modifications sont à réaliser pour avoir la transparence ?


Code:

int SIZE = 512;
  int nXSize = SIZE;
  int nYSize = SIZE;

  const char *pszFormat = "GTiff";
  GDALDriver *poDriver;
  char **papszMetadata;
  poDriver = GetGDALDriverManager()->GetDriverByName(pszFormat);

  GDALDataset *poDstDS;       
  
  // Création du fichier destination
  const char* pszDstFilename = "D:\\Workspace\\GDalTest1.7\\ConvertImage\\Sortie\\Output.tiff";

  char **papszOptions = NULL;
  papszOptions = CSLAddString(papszOptions, "NBITS=8");
  papszOptions = CSLAddString(papszOptions, "COMPRESS=LZW");

  poDstDS = poDriver->Create( pszDstFilename, SIZE, SIZE, 4, GDT_Byte, papszOptions );

  // Ecriture
  GDALRasterBand *poBand1 = poDstDS->GetRasterBand(1);
  GDALRasterBand *poBand2 = poDstDS->GetRasterBand(2);
  GDALRasterBand *poBand3 = poDstDS->GetRasterBand(3);
  GDALRasterBand *poBand4 = poDstDS->GetRasterBand(4);
  
  int nSize = SIZE * SIZE;
  GByte *bandRed    = new GByte[nSize]; 
  GByte *bandGreen  = new GByte[nSize];
  GByte *bandBlue   = new GByte[nSize];
  GByte *bandAlpha  = new GByte[nSize];

  for(int i=0; i< nSize; i++)
  {
    bandRed[i]   = 255;
    bandGreen[i] = 0;
    bandBlue[i]  = 0;
    bandAlpha[i] = 0; //i % 256;
  }

  poBand1->RasterIO( GF_Write, 0, 0, nXSize, nYSize, bandRed, nXSize, nYSize, GDT_Byte, 0, 0 );   
  poBand2->RasterIO( GF_Write, 0, 0, nXSize, nYSize, bandGreen, nXSize, nYSize, GDT_Byte, 0, 0 );
  poBand3->RasterIO( GF_Write, 0, 0, nXSize, nYSize, bandBlue, nXSize, nYSize, GDT_Byte, 0, 0 );
  poBand4->RasterIO( GF_Write, 0, 0, nXSize, nYSize, bandAlpha, nXSize, nYSize, GDT_Byte, 0, 0 );

  GDALClose( (GDALDatasetH) poDstDS );

  delete bandRed;
  delete bandGreen;
  delete bandBlue;
  delete bandAlpha;

Merci d'avance pour votre aide.

Hors ligne

 

Pied de page des forums

Powered by FluxBB