2013-01-07 3 views
7

Sto cercando di modellare un data Photo e chiedendosi che tipo da utilizzare per i dati dell'immagine:Che tipo utilizzare per i dati di immagine in memoria in Haskell?

> data Photo = 
> Photo 
> { photoUploaderId :: AccountId 
> , photoWidth :: Int 
> , photoHeight :: Int 
> , photoData :: ByteString 
> } 

sto usando Data.ByteString qui. C'è una scelta migliore?

Sfondo: ho intenzione di memorizzare i dati dell'immagine in un database e recuperarli e inviarli tramite una connessione di rete. Inserendo la foto nel database per la prima volta, potrei aver bisogno di manipolarla un po ', come il ridimensionamento, ecc.

risposta

10

Se stai per accedere a pixel arbitrari di foto usa uno unboxed array. Ti darà l'indicizzazione O (1) e un sovraccarico di spazio minimo. UArray (Int, Int) Word32 dovrebbe essere quello che stai cercando. Ricorda che gli array non condivisi sono rigidi. Se stai cercando la rigidità usa un Array, ma tieni presente che i valori dei pixel saranno racchiusi in una scatola che degrada le prestazioni.

Altri tipi di funzionalità simili e da considerare sono vectors.

D'altra parte, se non intenzione di manipolare i pixel e avrete trattare l'immagine come un blob, ByteString è una buona scelta. Questo è ciò per cui è stato progettato: blob di dati binari.

In breve: manipolare utilizzando Array o Vector, memorizzarlo e trasferirlo come ByteString.

+0

Grazie. Cosa succede se ho solo bisogno di inviare i dati dell'immagine tramite una connessione di rete? Non ho intenzione di manipolare i pixel per conto mio. –

+0

Sì, penso che per lo più ho solo bisogno di un blob allora. :-) –

6

In generale, UArray è una buona scelta. Dipende dal formato della foto, dal modo in cui leggi l'immagine e dal tipo di elaborazione che fai con esso. Trovo che la libreria Codec.Image.DevIL sia utile per l'elaborazione delle foto. Ecco un esempio di conversione di un'immagine JPEG in PNG.

import Codec.Image.DevIL 

main = do 
    ilInit 
    img <- readImage "test.jpeg" 
    writeImage "test.png" img 

La funzione readImage ha questa firma.

readImage :: FilePath -> IO (UArray (Int, Int, Int) Word8) 

E restituisce un array RGBA. Gli indici sono (riga, colonna, canale del colore). Quindi IO (UArray (Int, Int, Int) Word8) sarebbe una buona scelta se hai intenzione di usare quella libreria.

+0

Grazie. Ho aggiornato la mia domanda con uno sfondo più dettagliato. Posso usare Codec.Image.DevIL se i dati dell'immagine sono recuperati da un database? –

+0

Sembra che Codec.Image.DevIL abbia solo il supporto per la lettura da un file, quindi non penso che potresti usarlo per leggere da un database. – mhwombat

+0

Grazie. +1 per avermi fatto sapere una così buona lib :-D –

Problemi correlati