Newsgroup: it.comp.programmare.win32
Titolo: canale alpha in una BITMAP

Qualcuno sa come si pu' ottenere e scrivere il byte del canale alpha nei
pixel di una bitmap a 32bit ...
Cioe' la GetPixel() (SetPixel) (API) ritorna un valore a 32bit RGB con il
primo bye (piu' significativo)
a zero, poiche' sfruttano la struct COLORREF che e' definita nell'help
cosi':
The COLORREF value is a 32-bit value used to specify an RGB color.
Remarks
When specifying an explicit RGB color, the COLORREF value has the following
hexadecimal form:
0x00bbggrr
The low-order byte contains a value for the relative intensity of red; the
second byte contains a value for green; and the third byte contains a value
for blue. The high-order byte must be zero. The maximum value for a single
byte is 0xFF.
Come fare ?????
Grazie mille
Lorenzo

pixel di una bitmap a 32bit ...
Non credo sia possibile. O fai i calcoli a mano, oppure usi le DirectX.
Saluti,
    Mardy

 Come fare ?????
Stai cercando di usare AlphaBlend() per caso? :)
Dai un occhiata a questo piccolo esempio, dovrebbe aiutarti.
 #define RED   0
 #define GREEN 1
 #define BLUE  2
 #define ALPHA 3
 HBITMAP hBmp     = NULL; // Bitmap 24bit
 HBITMAP hABmp    = NULL; // Bitmap  8bit (alpha channel)
 HBITMAP hNewBmp  = NULL; // Bitmap 32 bit
 LPBYTE  pBits    = NULL; // Dati della Bitmap 24bit
 LPBYTE  pABits   = NULL; // Dati della Bitmap 8bit (alpha channel)
 LPBYTE  pNewBits = NULL; // Dati della Bitmap 32bit
 BITMAPINFO    bmi;
 BLENDFUNCTION BlendFunc;
 HDC hDC;
 HDC hMemDC;
 // Inizializzo la struttura dati
 memset(&(bmi.bmiHeader),0,sizeof(BITMAPINFOHEADER));
 bmi.bmiHeader.biSize        = sizeof(BITMAPINFOHEADER);
 bmi.bmiHeader.biWidth       = WIDTH;  // da impostare
 bmi.bmiHeader.biHeight      = HEIGHT; // da impostare
 bmi.bmiHeader.biPlanes      = 1;
 bmi.bmiHeader.biBitCount    = 32;
 bmi.bmiHeader.biCompression = BI_RGB;
 // Creo la bitmap ontenente l'immagine 24bit + 8bit alpha
 if (! hNewBmp = CreateDIBSection(NULL, &bmi, DIB_RGB_COLORS, &pNewBits,
NULL, 0))
  return ERROR_CREATING_BITMAP;
 else {
  hMemDC  = CreateCompatibleDC(NULL);
  SelectObject(mMemDC, hNewBmp);
 }
 // Carico la bitmap 24bit
 if (! hBmp = LoadBitmap(hInst,"Image_24bit"))
  return ERROR_LOADING_IMAGE;
 // Carico la bitmap 8bit alpha
 if (! hABmp = LoadBitmap(hInst,"Alpha_8bit"))
  return ERROR_LOADING_ALPHA;
 .
 .
 // Ottengo i dati delle bitmaps
 if (!GetDIBits(NULL, hBmp, 0, WIDTH, &pBits, NULL, DIB_RGB_COLORS)
  return ERROR_RETRIEVING_IMAGE_DATA;
 if (!GetDIBits(NULL, hABmp, 0, WIDTH, &pABits, NULL, DIB_RGB_COLORS)
  return ERROR_RETRIEVING_ALPHA_DATA;
 .
 .
 LPBYTE NewPixel = pNewBits;
 LPBYTE Pixel    = pBits;
 LPBYTE Alpha    = pABits;
 // Riempo il buffer 32bit della bitmap con alpha channel
 for (int y=0; y<HEIGHT; y++) {
  for (int x=0; x<WIDTH; x++, NewPixel+=4, Pixel+=3, Alpha++) {
   // I valori dei pixel vanno pre moltiplicati per il valore
   // dell'alpha channel e divisi per 0xff. Vedi MS PSDK.
   NewPixel[RED]   = Pixel[RED]   * (*Alpha)/255;
   NewPixel[GREEN] = Pixel[GREEN] * (*Alpha)/255;
   NewPixel[BLUE]  = Pixel[BLUE]  * (*Alpha)/255;
   NewPixel[ALPHA] = (*Alpha);
  }
 }
 .
 .
 BlendFunc.BlendOp            = AC_SRC_OVER;
 BlendFunc.BlendFlags         = 0;
 BlendFunc.SourceCostantAlpha = 255; // Importante vedi MS PSDK
 BlendFunc.AlphaFormat        = AC_SRC_ALPHA;
 hDC = GetDC(hWnd); // Ottieni il DC dall'handle della finestra
 SelectObject(hDC, hBackgroundBmp);
 .
 .
 // Esegue il blending...
 AlphaBlend(hDC, 0, 0, WIDTH, HEIGHT, hMemDC, 0, 0, WIDTH, HEIGHT,
BlendFunc);
Ho dato per scontato che sia l'immagine 24bit che l'alpha siano delle
stesse dimensioni. Stesso dicasi per l'immagine di background sulla
quale applico la bitmap a 32bit. Per ulteriori chiarimenti sulle funzioni
ti rimando al Platform SDK della Microsoft. Tieni pero' presente che
la funzione AlphaBlend() richiede come minimo Windows 98 o Windows 2000!
Ciao.
Il Michett@
--
-- 
Posted from 
relay2.inwind.it
 [212.141.53.73] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

Non credo sia possibile. O fai i calcoli a mano, oppure usi le DirectX.
Si puo' con AlphaBlend() (Win98/2K) che e' abbastanza macchinosa e poco
documentata (scoprire come si crea una bitmap con alpha e' una vera
impresa). In alternativa ci sono anche le OpenGL....


 Come fare ?????
Stia cercando di usare AlphaBlend() per caso? :)
