Newsgroup: it.comp.programmare.win32
Titolo: matrice di unsigned char in una immagine

Salve a tutti,
avrei bisogno di visualizzare una immagine che ho memorizzato in una matrice
di unsigned char di cui conosco
la dimensione e il formato dei pixel che la compongono.
Mi piacerebbe poterla visualizzare  all'ínterno di un Timage di c++builder.
Come posso fare?
Mi sembra di aver capito che potrei creare un Tmemorystream e copiargli
dentro la matrice,
e dopo creare una Tbitmap e chiamare loadfromstream per caricare l'immagine
nella bitmap,
assegnare la bitmap a un Tpicture e poi il Tpicture a Timage,
ma mi sembra che la cosa sia un po' macchinosa e possa risultare lenta.
Qualcuno ha da darmi dei suggerimenti in merito?
Grazie in anticipo
Alessandro

...

Mi sono già imbattutto sulle tue problematiche e ho risolto
nel seguente modo:
premesso che avrai, probabilmente, già provato ad accedere
al singolo pixel dell'oggetto TImage e avrai notato una lentezza
esasperante nel visualizzare l'immagine, io ho utilizzato un trucco
simile, nel concetto, a quello da te proposto:
-registro la matrice in formato bitmap su un file temporaneo
-carico con il metodo LoadFromFile della Picture di TImage l'immagine
-cancello il file temporaneo
sembra macchinoso, e non so se sia un metodo ortodosso, ma è
veloce (con immagini e computer 'normali').
Per registrare l'immagine in formato bitmap (.bmp) utilizza le strutture
BITMAPFILEHEADER
BITMAPINFOHEADER
di cui trovi la documentazione sull'help win32 della MS fornito con il
Builder.
Se hai bisogno di altre delucidazioni sono a disposizione
Ciao
     Davide

Siccome non eri interessato al metodo che avevo utilizzato io, e cioe'
di sfruttare un file temporaneo in cui registrare l'immagine in formato
bitmap e caricarlo nel componente TImage, ho smanettato qualche
oretta e ti posso proporre il passaggio attraverso la Clipboard
di Windows (credo che di meglio non si possa utilizzare !!!!)
Ti metto pure il codice che ho tirato fuori, ma ti consiglio comunque di
dare un'occhiata approfondita all'help per migliorare o adattare il tutto
al tuo caso.
Infatti io ho creato una piccola immagine in toni di grigio (ho sempre
lavorato con tali immagini per la mia tesi) l'ho copiata nella clipboard
e trasferita sulla Image.
Se hai bisogno d'altro fammi sapere.
Ciao.
    Davide
P.S. Attenzione ad includere la Clipbrd.cpp.
(non è compreso il Form in cui ho semplicemente messo un TButton
ed un TImage)
/*-------------------------------------------------------------------------*
/
#include <vcl.h>
#pragma hdrstop
#include <clipbrd.hpp>
#include "ProvaUnit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
/*--------------------------------------------------------------------------
*/
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
/*--------------------------------------------------------------------------
*/
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int i;
/*--------------------------- Creo una piccola immagine di 64*64 pixels ----
--------------------------- con tutte le sfumare e una croce ------------*/
unsigned char image[4096];
for(i=0;i<4096;i++)image[i]=i;
for(i=0;i<64;i++)
  {image[i*64 +i ]=255;
   image[i*64 + 63-i]=0;
   }
BITMAPINFO *infoHeader; /*-- struttura contenente la palette e i dati
                          -- riguardanti l'immagine creata  */
infoHeader = new BITMAPINFO
                   [sizeof(BITMAPINFOHEADER)+ 256*sizeof(RGBQUAD) ];
infoHeader->bmiHeader.biSize =  sizeof(BITMAPINFOHEADER);
infoHeader->bmiHeader.biWidth = 64; /*--dimensioni in pixel dell'immagine*/
infoHeader->bmiHeader.biHeight = 64;
infoHeader->bmiHeader.biSizeImage = 0; /*--puo' essere nulla per immagini
                                        --non compresse*/
infoHeader->bmiHeader.biPlanes =1;    /*-- deve essere posto a 1 */
infoHeader->bmiHeader.biBitCount = 8; /*-- numero di bit per pixel  */
infoHeader->bmiHeader.biCompression = BI_RGB; /*nessuna compressione  */
infoHeader->bmiHeader.biXPelsPerMeter = 0;  /*-- possono essere nulli  */
infoHeader->bmiHeader.biYPelsPerMeter = 0;
infoHeader->bmiHeader.biClrUsed = 0;
infoHeader->bmiHeader.biClrImportant =0;
/*-- registra la palette dei colori che nel caso di toni di grigio
-- ha i tre valori R G B uguali.  */
for(i=0;i<256;i++)
   {
    infoHeader->bmiColors[i].rgbBlue=(BYTE)i;
    infoHeader->bmiColors[i].rgbGreen=(BYTE)i;
    infoHeader->bmiColors[i].rgbRed=(BYTE)i;
    infoHeader->bmiColors[i].rgbReserved=0;
   }
unsigned int handleBitmap;
/*-- crea e restituisce l'handle dell'immagine bitmap  */
handleBitmap = (unsigned int) CreateDIBitmap(
       GetDC(Handle), &infoHeader->bmiHeader, CBM_INIT,
       image, infoHeader, DIB_RGB_COLORS     );
/*- inserisce nella clipboard l'immagine come bitmap  */
Clipboard()->SetAsHandle(CF_BITMAP, handleBitmap);
/*-- recupera attraverso il metodo della TPicture
  -- l'immagine dalla clipboard  */
Image1->Picture->LoadFromClipboardFormat(
      CF_BITMAP, Clipboard()->GetAsHandle(CF_BITMAP), 0 );
}
/*--------------------------------------------------------------------------
*/