007
29.12.2003, 21:59 Uhr
FloSoft
Medialer Over-Flow (Administrator)
|
Habe herausgefunden wie:
C++: |
#define RGBA_EQUAL 0 #define RGBA_GREATER 1 #define RGBA_LESS 2
GLubyte *RGB2RGBA(GLubyte *Image, int length, int bpp, UINT type, GLubyte *Transp) { int multi = 3; if(bpp == 32) multi = 4; GLubyte *NewData = new GLubyte[length*4]; for(int i=0; i<length; i++) { NewData[4*i + 0] = Image[multi*i + 0]; //R NewData[4*i + 1] = Image[multi*i + 1]; //G NewData[4*i + 2] = Image[multi*i + 2]; //B if(bpp == 32) NewData[4*i + 3] = Image[multi*i + 3]; //A switch(type) { case RGBA_EQUAL: { if(Image[multi*i + 0] == Transp[0] && Image[multi*i + 1] == Transp[1] && Image[multi*i + 2] == Transp[2] ) NewData[4*i + 3] = 255; //A else NewData[4*i + 3] = 0; //A } break; case RGBA_GREATER: { if(Image[multi*i + 0] < Transp[0] && Image[multi*i + 1] < Transp[1] && Image[multi*i + 2] < Transp[2] ) NewData[4*i + 3] = 255; //A else NewData[4*i + 3] = 0; //A } break; case RGBA_LESS: { if(Image[multi*i + 0] > Transp[0] && Image[multi*i + 1] > Transp[1] && Image[multi*i + 2] > Transp[2] ) NewData[4*i + 3] = 255; //A else NewData[4*i + 3] = 0; //A } break; } } free(Image); return NewData; }
|
benutzen kannst du es z.b so:
C++: |
GLubyte Transp[] = {240,240,240}; UINT width = 256,height = 256; UBYTE *imageData = (UBYTE *)malloc(width*height*3); // einlesen: ... imageData = RGB2RGBA(imageData,width*height, 24, RGBA_GREATER, Transp) // textur erstellen: ... free(imageData);
|
in obigem Fall wird jede Farbe, die "größer" als 240,240,240 ist, Transparent. Wenn man eine bestimmte Farbe angeben will muss man
RGBA_EQUAL
eintragen, für einen alle Farben kleiner als den eingegebenen Wert
RGBA_LESS
der übergebene Buffer hat in obigem Fall nur RGB-Werte, wie z.b von einem Bitmap. Wenn man schon Images mit Alpha-Channel (z.b TGA's) hat, muss man statt 24 32 vor RGBA_* eintragen -- class God : public ChuckNorris { }; |