Convertire immagini RAW di fotocamere digitali mediante le funzioni esterne del API di Libraw

Da Gambas-it.org - Wikipedia.

Libraw è una libreria per la lettura dei file RAW ottenuti da fotocamere digitali fotografiche (CRW/CR2, NEF, RAF, DNG, MOS, KDC, DCR ed altri).

Per poter utilizzare in Gambas le risorse di questa libreria, bisognerà installare e richiamare la libreria condivisa: "libraw_r.so.19.0.2 "

Mostriamo di seguito un semplice esempio di come convertire un file immagine di tipo RAF in un file immagine di tipo PPM:

Library "libraw_r:19.0.2"

' libraw_data_t * libraw_init(unsigned int flags)
Private Extern libraw_init(flags As Integer) As Pointer

' int libraw_open_file(libraw_data_t*, const char *)
Private Extern libraw_open_file(libraw_data_t As Pointer, fileRawIn As String) As Integer

' int libraw_unpack(libraw_data_t*)
Private Extern libraw_unpack(libraw_data_t As Pointer) As Integer

' int libraw_dcraw_process(libraw_data_t* lr)
Private Extern libraw_dcraw_process(libraw_data_t As Pointer) As Integer

' int libraw_dcraw_ppm_tiff_writer(libraw_data_t* lr,const char *filename)
Private Extern libraw_dcraw_ppm_tiff_writer(libraw_data_t As Pointer, filename As String) As Integer

' const char *libraw_strerror(int errorcode)
Private Extern libraw_strerror(errocode As Integer) As String

' void libraw_close(libraw_data_t*)
Private Extern libraw_close(libraw_data_t As Pointer)
 

Public Sub Main()

 Dim libraw_data As Pointer
 Dim st As Stream
 Dim fileRAW, filePPM, make, model As String
 Dim err As Integer

 fileRAW = "/percorso/del/file.raf"
 filePPM = "/percorso/del/nuovo/file.ppm"
 
 libraw_data = libraw_init(0)
 If libraw_data == 0 Then Error.Raise("Impossibile inizializzare la libreria 'libraw' !")
 
 st = Memory libraw_data For Read Write
 Seek #st, 476
 Write #st, 1 As Integer
        
 err = libraw_open_file(libraw_data, fileRAW)
 If err Then Error.Raise("Errore: " & libraw_strerror(err) & " !")

 Seek #st, 176
 Read #st, make
 Seek #st, Seek(st) + 2
 Read #st, model
 Print "Processo di: ", Null, fileRAW; "  ("; make; " - "; model; ")"
  
 err = libraw_unpack(libraw_data)
 If err Then Error.Raise("Errore: " & libraw_strerror(err) & " !")
  
 err = libraw_dcraw_process(libraw_data)
 If err Then Error.Raise("Errore: " & libraw_strerror(err) & " !")
  
 Print "Scrittura del file: ", Null; filePPM

 err = libraw_dcraw_ppm_tiff_writer(libraw_data, filePPM)
 If err Then Error.Raise("Errore: " & libraw_strerror(err) & " !")

' Va in chiusura:
 st.Close
 libraw_close(libraw_data)

End


Riferimenti