Lezione 6, Immagini JPEG

In questa lezione tratteremo la visualizzazione delle immagini jpeg, parto sempre dal presupposto che abbiate letto le lezioni precedenti, o che abbiate già delle conoscenze basi della programmazione C.

La nostra stuttura sarà come di consueto composta da una due cartelle e quattro file, come potete vedere qui in basso la struttura:

  1. Codice sorgente (cartella)
  2. include (cartella)
  3. about.jpg (file immagine)
  4. source (cartella)
  5. main.c (file sorgente)
  6. picture.s (file variabili immagine)
  7. Makefile (file per la compilazione) parte1, part2, parte3

Da notare che il file “about.jpg” è un immagine a sfondo nero e non un “.png” a sfondo trasparente, innanzittutto bisogna scaricare le librerie “libogc_jpeg”, questo dovrà essere decompresso e collocato:

/(percorso)/devkitPro/devkitPPC/powerpc-gekko

Attenzione sarà necessario sovrascrivere alcuni file o cartelle ma non preoccupatevi.

Ora dobbiamo modificare il nostro “Makefile” per includere le librerie “JPEG”:

1
LIBS    :=  -logc -lm -ljpeg

Ora possimao concentrarci sul file “main.c”, perchè dobbiamo aggiungere primo l’header della libreria “JPEG” per potervi accedere inserendo in alto la seguente riga:

1
#include ;

Ora dobbiamo definire 2 variabili “piclength” e “picdata”, che troviamo nel file “picture.s“, le definiamo come “exern” in modo che il compilatore capisce che queste due variabili sono state definite altrove (nell file “picture.s“), in questo modo possono essere lette ovunque.

1
2
extern char picdata[];
extern int piclength;

Il prossimo passo è aggiungere il seguente codice che ho preso in prestito da un’altro script:

1
2
3
4
5
6
7
8
9
10
11
12
void display_jpeg(JPEGIMG jpeg, int x, int y) {
     unsigned int *jpegout = (unsigned int *) jpeg.outbuffer;
     int i,j;
     int height = jpeg.height;
     int width = jpeg.width/2;
     for(i=0;i<=width;i++) {
          for(j=0;j<=height-2;j++) {
               xfb[(i+x)+320*(j+16+y)]=jpegout[i+width*j];
               free(jpeg.outbuffer);
          }
     }
}

Questa funzione necessita di tre variabili. la prima definisce la struttura della nostra immagine e i due interi successivi sono le coordinate dove vogliamo visualizzarla.

La prima è legata a come opera la bibliotecha “JPEG”, ved remo in seguito come poter decomprimere l’immagine, “jpeg.outbuffer” e dove viene memorizzata la nostra immagine.

La seconda linea definisce alcune variabili locali per strutturare l’altezza e la larghezza dell’immagine e poi copiarla sullo schermo in video per il frame buffer, per le coordinate “x” e “y” che abbiamo stabilito.

L’ultima riga definisce lo spazio di memoria che utilizziamo per la prima funzione.

Ora possiamo iniziare ad aggiungere le funzioni principali jpeg nel “main ()”. In primo luogo si definiamo la variabile che useremo, JPEGIMG la struttura dei dati.

1
JPEGIMG about;

Dopo di che dobbiamo assegnare alla nostra memoria la variabile “about”

1
 memset(&about, 0, sizeof(JPEGIMG));

Secondo il nostro file”picture.s“, esso contiene due variabili; l’immagine dei dati e la lunghezza della foto. Definiamo la nostra variabile “about” con variabile “about.inbuffer” e “about.inbufferlength” con entrambe le variabili globali.

1
2
about.inbuffer = picdata;
about.inbufferlength = piclength;

Ora c’è la necessità di decomprimere l’immagine passandola sulla variabile “about”.

1
JPEG_Decompress(&about);

L’ultimo passo ora è visualizzare l’immagine sulle cordinate stabilite “x” e “y” grazie alla variabile “about”.

1
display_jpeg(about, 60, 100);

Il risultato finale è ora:

1
2
3
4
5
6
7
8
9
10
int main() {
     JPEGIMG about;
     memset(&about, 0, sizeof(JPEGIMG));
     about.inbuffer = picdata;
     about.inbufferlength = piclength;
     JPEG_Decompress(&about);
     Initialise();
     display_jpeg(about, 60, 100);
     return 0;
}

Compilando il codice avremo questo risultato:

resultat_lezione_6

.

.

.

.

.

.

Per oggi è tutto arrivederci alla prossima lezione ciriciao.

RiujiAndy

Tratto e concesso da: http://ryujiandy.ath.cx/

Related Posts with Thumbnails

Filed Under: Programmazione

Tags: