2012-09-07 10 views
6

Sto utilizzando un file di report e un controllo ReportViewer per mostrare un report che carica i dati dinamicamente dagli oggetti durante l'esecuzione.Come mostrare l'immagine dall'array di byte nel report Microsoft

Ho bisogno di mostrare un'immagine che è memorizzata come una matrice di byte nell'oggetto.

Il valore del PictureBox è attualmente impostato su:

=First(Fields!ImageData.Value, "dtstItemImage") 

E io impostare il DataSource utilizzando:

ImageBindingSource.DataSource = this.item.Image.ImageData; 

Il codice compilato ed eseguito, ma l'immagine non viene visualizzato nel report.

Ciò è dovuto al fatto che PictureBox deve essere associato a un oggetto Immagine (e non a un array di byte)? O ci sono forse alcune proprietà del PictureBox che devo impostare?

UPDATE 1

Ho aggiunto un bordo al PictureBox solo per assicurarsi che sia la sua visibile e tuttavia esse indicano nel rapporto. Semplicemente non contiene l'immagine.

UPDATE 2

Ho corretto un errore nel mio codice. Ho cambiato:

ImageBindingSource.DataSource = this.item.Image.ImageData; 

a:

ImageBindingSource.DataSource = this.item.Image; 

come PictureBox è legato al campo ImageData MA il DataSource è l'oggetto immagine.

Ora ho una piccola icona a croce invece di niente che (almeno per me) indica qualche progresso ma non so dove debba essere il byte [] - codice di conversione bitmap.

+0

Come viene formattata l'immagine? Probabilmente hai bisogno di deserializzare un flusso di byte: http://stackoverflow.com/questions/1156608/feedback-on-code-to-serialize-deserialize-and-save-image – MrFox

+0

Cosa intendi con "formattato"? L'immagine nell'array di byte è presa da una cella BLOB del database ed è un JPEG. – Rachel

+0

@Rachel, MrFox (e io sotto) si riferiscono a come l'immagine è stata codificata in un array di byte. Potrebbe essere necessario tamponare i byte per allinearli ai limiti. Guarda come l'ho fatto in questo Q & A http://stackoverflow.com/questions/2750342/unsigned-char-buffer-freetype2-bitmap-to-systemdrawingbitmap – Dennis

risposta

3

sono riuscito a risolvere questo impostando casella immagine del rapporto Source struttura al Database (in precedenza era impostato su External).

Ulteriori informazioni sui diversi valori Source disponibili sono disponibili al numero (MSDN) HowTo: Add an Image (Reporting Services).

1

È necessario creare un oggetto immagine dall'array di byte e utilizzarlo come origine.

Per fare questo, è possibile utilizzare una funzione di supporto come la seguente

public static Image LoadImage(byte[] imageBytes) 
{ 
    Image image = null; 
    using (var ms = new MemoryStream(imageBytes)) 
     image = Image.FromStream(ms); 

    return image; 
} 

Modifica

per WPF, è necessario utilizzare BitmapSource (MSDN) al posto di Image (MSDN)

public static BitmapSource LoadImage(Byte[] imageBytes) 
{ 
    var image = new BitmapImage(); 
    using (var ms = new MemoryStream(binaryData)) 
    { 
     image.BeginInit(); 
     image.StreamSource = ms; 
     image.CacheOption = BitmapCacheOption.OnLoad; 
     image.EndInit(); 
    } 

    if (image.CanFreeze) 
     image.Freeze(); 

    return image; 
} 

NB: È inoltre possibile eseguire questa operazione utilizzando IValueConverter, vedere questo blog post for the source code.


e quindi modificare i dati vincolante

ImageBindingSource.DataSource = LoadImage(item.Image.ImageData); 

...

Assicurarsi che l'immagine (e MemoryStream) è disposto correttamente quando hai finito con esso, altrimenti si perdite memoria.

Inoltre, a seconda del formato del vostro array di byte, potrebbe essere necessario fare un po 'di lavoro. Vedi uno dei miei question/answers for some helpful information.

+0

L'ho provato e non funziona neanche. È come se PictureBox non fosse nemmeno nel report. – Rachel

+0

anche U dovrebbe smaltire il flusso di memoria. 'Image returnImage; utilizzando (MemoryStream ms = new MemoryStream (byte)) {returnImage = Image.FromStream (ms);} return returnImage; ' – Dmytro

+0

Ancora non ha funzionato. Ho dovuto usare image.StreamSource = ms perché il metodo .SetSource non è stato trovato. Questo potrebbe essere il problema? – Rachel

Problemi correlati