Categorie
PowerBuilder Tips

Da Byte Array a Image

In diversi contesti, ad esempio a seguito di chiamate ad API web, si rende necessario convertire un’immagine restituita come byte array nel corrispondente file. Vediamo in questo articolo come fare in C# e PB.

Indice

Introduzione
L’origine in C#
In Powerbuilder: array e blob
Consume in Powerbuilder

Introduzione

Un webservice che ritorna un’immagine è una funzionalità molto utile in molti casi d’uso. Ad esempio, può essere utilizzato per fornire immagini dinamiche in un’applicazione web o mobile, come per esempio la generazione di miniature di immagini o l’applicazione di filtri.

Un webservice che ritorna un’immagine può essere utilizzato per integrare immagini in altri sistemi, come la generazione di report, la creazione di documenti o la generazione di mappe personalizzate.

In sintesi, un webservice che ritorna un’immagine consente una maggiore flessibilità nella gestione delle immagini e consente di integrarle in altri sistemi in modo semplice e scalabile.

Questa funzionalità permette di mantenere le immagini separate dalla logica dell’applicazione , ed è utile quando l’immagine deve essere fornita da un sistema separato o per evitare che l’immagine stessa venga utilizzata da più sorgenti senza che le modifiche apportate all’immagine originale vengano riprodotte in tutte le applicazioni che la utilizzano.

L’origine in C#

In C#, è possibile convertire un’immagine in un array di byte utilizzando la classe System.IO.MemoryStream e la classe System.Drawing.Image.

La classe System.IO.MemoryStream è un flusso di memoria che consente di creare, gestire e utilizzare un buffer di memoria come se fosse un flusso tradizionale. La classe System.Drawing.Image è invece utilizzata per creare, gestire e utilizzare immagini.

Per convertire un’immagine in un array di byte, è possibile utilizzare il seguente codice:

using System.Drawing;
using System.IO;

// Carica l'immagine da convertire
Image image = Image.FromFile("path/to/image.jpg");

// Crea un nuovo flusso di memoria
using (MemoryStream ms = new MemoryStream())
{
    // Salva l'immagine nel flusso di memoria
    image.Save(ms, ImageFormat.Jpeg);
    // Recupera i dati del flusso di memoria come array di byte
    byte[] imageData = ms.ToArray();
}

Il codice sopra carica un’immagine utilizzando la classe System.Drawing.Image.FromFile() e la salva in un nuovo flusso di memoria utilizzando il metodo Save().

Infine utilizzando il metodo ToArray() del memorystream si può recuperare i dati come array di byte.
È possibile utilizzare anche il metodo Image.Save() per salvare l’immagine in un file e utilizzare la classe FileStream per leggere i dati del file in un array di byte.

using System.IO;

//Salva l'immagine nel file
image.Save("path/to/image.jpg", ImageFormat.Jpeg);

// Crea un nuovo FileStream per leggere i dati dell'immagine
using (FileStream fs = new FileStream("path/to/image.jpg", FileMode.Open, FileAccess.Read))
{
    // Crea un array di byte per contenere i dati dell'immagine
    byte[] imageData = new byte[fs.Length];
    // Legge i dati dell'immagine nel array di byte
    fs.Read(imageData, 0, (int)fs.Length);
}

Questo codice utilizza la classe System.IO.FileStream per leggere i dati dell’immagine in un array di byte. Il FileStream viene utilizzato per aprire il file in modalità lettura e utilizzare il metodo Read() per leggere i dati nel array di byte.

In entrambi i casi il risultato finale è un array di byte che contiene i dati binari dell’immagine e può essere utilizzato per scopi come la trasmissione dei dati, la memorizzazione in un database o qualsiasi altro scopo per cui si voglia utilizzare i dati binari dell’immagine.

È importante notare che ci sono diverse proprietà e metodi in C# per gestire i formati delle immagini e la loro conversione. Ad esempio, la classe Image fornisce il metodo Save() con il quale è possibile salvare l’immagine in diverse formati come Jpeg, Png, Gif e molti altri. In questo modo, è possibile scegliere il formato più appropriato per il proprio progetto.

Inoltre, si può utilizzare la classe ImageConverter per convertire un’immagine in un array di byte:

ImageConverter converter = new ImageConverter();
byte[] imageData = (byte[])converter.ConvertTo(image, typeof(byte[]));

In conclusione, convertire un’immagine in un array di byte in C# è un’operazione semplice che può essere effettuata utilizzando la classe System.IO.MemoryStream o la classe System.IO.FileStream e utilizzando le proprietà e i metodi della classe System.Drawing.Image. È importante considerare il formato desiderato per l’immagine e la gestione della memoria quando si lavora con grandi quantità di dati. Utilizzando le funzionalità appropriate e una buona gestione della memoria, è possibile creare soluzioni efficaci e scalabili per la gestione delle immagini in C#.

Inoltre, si può utilizzare la classe ImageConverter che fornisce un modo semplice e veloce per effettuare la conversione, senza doversi preoccupare di utilizzare MemoryStream o FileStream.

In generale, è importante scegliere la soluzione più appropriata per il proprio progetto, tenendo conto delle esigenze specifiche, delle prestazioni, della memoria e della compatibilità dei formati. E’ sempre una buona pratica effettuare test delle prestazioni e verificare la corretta gestione della memoria per garantire che la soluzione scelta sia adeguata per le esigenze del progetto.

In Powerbuilder: array e blob

PowerBuilder è un ambiente di sviluppo integrato (IDE) utilizzato per creare applicazioni aziendali. Tra le sue funzionalità c’è la possibilità di lavorare con array di dati e Blob (binary large object). Un array è una raccolta ordinata di dati del medesimo tipo, mentre un Blob è un tipo di dato che può contenere una grande quantità di dati binari, come immagini, documenti o file audio. In alcuni casi, potrebbe essere necessario convertire un array in un blob per la memorizzazione o la trasmissione dei dati.

La conversione di un array in un Blob può essere utile in diversi casi. Ad esempio, potrebbe essere necessario memorizzare un’immagine in un database, ma le immagini sono tipicamente rappresentate come array di byte. In questo caso, è necessario convertire l’array in un Blob prima di memorizzarlo nel database. Un altro utilizzo potrebbe essere la trasmissione di dati tramite una connessione di rete, in quanto i dati binari (come i file audio, video o immagini) possono essere più facilmente trasmessi come Blob rispetto ad array di byte.

Per convertire un array in un blob in PowerBuilder, è necessario utilizzare la funzione Blob(). Questa funzione accetta come parametro un array e restituisce un oggetto blob che rappresenta i dati dell’array.

// Creiamo un array di interi
integer li_array[]
li_array[1] = 1
li_array[2] = 2
li_array[3] = 3

// Convertiamo l'array in un blob
blob lb_blob
lb_blob = Blob(li_array)

Nell’esempio sopra, l’array “li_array” è un array di interi che contiene i valori 1, 2 e 3. La funzione Blob() viene utilizzata per convertire l’array in un oggetto blob “lb_blob” contenente i dati dell’array.

Una volta convertito l’array in un blob, è possibile utilizzarlo per la memorizzazione o la trasmissione dei dati. Ad esempio, si può memorizzare un blob in una colonna BLOB del database per salvarvi le immagini, i file audio o qualsiasi altro tipo di dati binari. Oppure, si può inviare un blob attraverso una connessione di rete, utilizzando un protocollo come FTP o HTTP, per trasmettere i dati.

D’altra parte è possibile convertire un blob in un array e viceversa.

Blob lblb_1
Any a
byte lbyte_array[], lbyte_array2[]

// initialize array
lbyte_array[] = {1,10,100,200,255}
a = lbyte_array
lblb_1 = Blob(a)
lbyte_array2[] = GetByteArray(lblb_1)

La conversione tra array e blob può essere utile in alcune situazioni specifiche in cui i dati devono essere memorizzati o trasmessi in modo differente rispetto alla loro forma originale.

In conclusione, la conversione tra array e blob in PowerBuilder è una funzionalità utile che può essere utilizzata in situazioni specifiche per la memorizzazione o la trasmissione dei dati. Tuttavia, è importante essere consapevoli delle implicazioni della conversione e valutare se sia la scelta più appropriata per il proprio progetto. Inoltre, utilizzando le funzioni appropriate, è possibile manipolare i dati all’interno del blob in modo più efficiente.

Consume in Powerbuilder

Capito quanto sopra, la visualizzazione di un’immagine che arriva da una byte array passando per un blob è un’operazione semplice e comune nello sviluppo di applicazioni.

Il primo passo per utilizzare questa funzione è quello di creare un oggetto BLOB a partire dall’array di byte. È possibile farlo utilizzando la funzione “Blob()”, passando come parametro l’array di byte. Una volta creato l’oggetto BLOB, è possibile assegnarlo a un oggetto picture.

Il codice seguente mostra come convertire un array di byte in un’immagine in PowerBuilder:

p_1.setpicture(lblob_raw)