Newsgroup: it.comp.programmare.win32
Titolo: Device Indipendent Bitmaps (DIB)

Ciao a tutto il NG, ho un problema che che non riesco a risolvere e che
oramai mi sta esasperando.
Ho necessità di manipolare (suddividere una immagine in più parti o
raggruppare più immagini in una) delle immagini bitmap di varie grandezze e
varie profondità di colore e per far ciò utilizzo le DIB.
Inizialmente, ignorando come il Win32 gestisce realmente le Bitmap,
utilizzavo con successo (LoadImage, HDC di memoria, Bitblt, ecc..) le DDB ma
ero limitato a dei formati compatibili con quello dello schermo. Ora
utilizzando le DIB sto incontrando una miriade di problemi: l'immagine che
si distorce, la palette che non coincide benchè prenda le opportune
precauzioni, ecc. Ho cercato della documentazione in rete ma non ho trovato
nulla. Qualcuno saprebbe indicarmi un sito dove trovare della documentazione
o degli esempi sulle DIB? Oppure qualche anima buona che sia disposta a
scrivere due righe di codice sull'argomento? Qualsiasi cosa che possa
aiutarmi insomma. Please.
Grazie in anticipo a chi si interesserà al mio problema
Ciao, Giuseppe
---------------------------------------------------------------------------
_Guybrush su IRCNet canale #programmazione
ICQ: 42227764
---------------------------------------------------------------------------

Ciao, Giuseppe
Saluti,
    Mardy

 Ma temo di non avere piu' il codice, che forse era addirittura per win 3.1
Grazie Mardy per avermi risposto, stavo quasi per buttare la spugna. Cmq,
prima di passare al mio problema, voglio cogliere l'occasione di augurare
(in ritardo) Buon Natale a te e a tutto il newsgroup.
Veniamo al mio problema. Spronato dal tuo messaggio ho incentrato le mie
prove sull'API SetDIBitsToDevice() e sono riuscito (con dei problemi) a
trasferire le immagini su un DC di memoria per salvarle su file (prima mi
incasinavo con i parametri - addirittura anche l'MSDN afferma che la
funzione è un pò criptica a causa della compatibilità con OS/2). Ho quindi
dato un'occhiata alla Knowledge Base per assicurarmi su eventuali BUG e ho
trovato un articolo che sconsigliava di usare SetDIBitsToDevice() con i DC
di memoria. Sono quindi passato all'API StretchDIBits e ho avuto risultati
analoghi a SetDIBitsToDevice: in pratica con le immagini a 24 bpp tutto OK
mentre le immagini a 8 bpp risultano come deformate orizzontalmente nella
parte centrale (la palette è OK). Non capisco a cosa possa essere dovuto:
sto utilizzando delle immagni con risoluzioni multiple di 4 e non applico
alcun tipo di compressione. Hai qualche idea?
Ecco la porzione di codice interessata:
 HDC hdcTarget;
 HBITMAP hbTarget, hbSource;
 DIBSECTION dibSource;
 BITMAPINFO *lpBitmapInfo;
 void *lpBits;
/* Questa porzione di codice copia un'immagine DIB in un'altra */
  // Retrieves source bitmap informations
  hdcSource = CreateCompatibleDC(NULL);
  hbSource = (HBITMAP)LoadImage(NULL, szString, IMAGE_BITMAP, 0, 0,
LR_LOADFROMFILE | LR_CREATEDIBSECTION);
  SelectObject(hdcSource, hbSource);
  GetObject(hbSource, sizeof(DIBSECTION), &dibSource);
  // Creates destination bitmap and device context
  if(dibSource.dsBm.bmBitsPixel<24)
  {
   lpBitmapInfo = (BITMAPINFO *)LocalAlloc(LMEM_FIXED,
sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * (1 <<
dibSource.dsBm.bmBitsPixel));
   GetDIBColorTable(hdcSource, 0, (1 << dibSource.dsBm.bmBitsPixel),
lpBitmapInfo->bmiColors);
  }
  else
  {
   lpBitmapInfo = (BITMAPINFO *)LocalAlloc(LMEM_FIXED,
sizeof(BITMAPINFOHEADER));
  };
  CopyMemory(&(lpBitmapInfo->bmiHeader), &(dibSource.dsBmih),
sizeof(BITMAPINFOHEADER));
  hdcTarget = CreateCompatibleDC(NULL);
  hbTarget = CreateDIBSection(NULL, lpBitmapInfo, DIB_RGB_COLORS, &lpBits,
NULL, 0);
  SelectObject(hdcTarget, hbTarget);
//  SetDIBitsToDevice(hdcTarget, 0, 0, lpBitmapInfo->bmiHeader.biWidth,
lpBitmapInfo->bmiHeader.biHeight, 0, lpBitmapInfo->bmiHeader.biHeight - 1,
lpBitmapInfo->bmiHeader.biHeight-1, lpBitmapInfo->bmiHeader.biHeight,
dibSource.dsBm.bmBits, lpBitmapInfo, DIB_RGB_COLORS);
  StretchDIBits(hdcTarget, 0, 0, lpBitmapInfo->bmiHeader.biWidth,
lpBitmapInfo->bmiHeader.biHeight, 0, 0, lpBitmapInfo->bmiHeader.biWidth,
lpBitmapInfo->bmiHeader.biHeight, dibSource.dsBm.bmBits, lpBitmapInfo,
DIB_RGB_COLORS, SRCCOPY);
SaveBitmap(hdcTarget, "E:\\Output\\Prova.bmp");
Grazie per l'interessamento


alcun tipo di compressione. Hai qualche idea?
Prova ad impostare lo schermo a 8 bpp... Che profondita' di colore hai
impostato? Cosa succede se carichi bitmaps con 16 bpp?
Saluti,
    Mardy

Cosa succede se carichi bitmaps con 16 bpp?
Purtroppo non ho possibilità di testare le bitmap a 16bpp, non ho nessun
programma che mi permetta di effettuare la conversione a questa profondità
di colore :-(
Grazie per l'aiuto che mi stai offrendo
