Scusate la mia ignoranza sulla terminologia grazie della correzione. Tra l'altro ho anche scritto male il codice...ho fatto l'anteprima per vedere come si vedeva ma penso che, sbadatamente, ho cliccato su invia. Un'altra cosa che mi sono dimenticato prima è che l'immagine su cui ho fatto la prova è 1113x1118 pixels.
codice:
//Programma windows sistema operativo XP Professional IDE visual studio C++ 2010 Express
#include "stdafx.h"
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
struct PIXEL
{
unsigned int b;
unsigned int g;
unsigned int r;
PIXEL *succ;
};
typedef PIXEL* rgb;
int _tmain(int argc, _TCHAR* argv[])
{
clock_t start,end;
double diff;
rgb inizio=NULL;
rgb nuovo=NULL;
rgb ultimo=NULL;
rgb bin=NULL;
FILE *imm = NULL;
FILE *ris = NULL;
long int i=0;
long int z=0;
long int j=0;
long int x=0;
int trash;
long int height;
long int width;
long int image_size=0;
char nome_file[30];
char r,g,b;
char padding;
cout<<"Inserisci il nome dell'immagine:";
cin.getline(nome_file,30);
imm = fopen(nome_file, "rt");
ris = fopen("copia.bmp", "wb");
cout<<"Dimmi la larghezza dell'immagine:";
cin>>width;
cout<<"Dimmi l'altezza dell'immagine:";
cin>>height;
image_size=width*height*3 + ((width%4)*height) +54;
if(imm==NULL)
{
cout<<"Errore nell'apertura del file immagine."<<endl;
}
else if(ris==NULL)
{
cout<<"Errore nell'apertura del file immagine."<<endl;
}
else
{
cout<<"Apertura del file immagine avvenuta."<<endl;
cout<<"La grandezza effettiva dell'immagine e' "<<image_size<<endl;
cout<<"Ma la matrice di interesse e' "<<width*height*3<< "pixels"<<endl;
i=0;
cout<<"Inizio acquisizione header... ";
while(i<54) //Elimina i primi 54 bytes dal file relativi all'header
{
trash=fgetc(imm);
fwrite (&trash, sizeof(char), 1, ris);
i++;
}
cout<<"Fatto!"<<endl;
cout<<"L'header e' stato scritto nel nuovo file."<<endl;
ultimo=inizio;
cout<<"Inizio acquisizione del corpo dell'immagine... ";
while(z<height)
{
j=0;
while(j<width)
{
nuovo=new PIXEL;
nuovo->r=fgetc(imm);
nuovo->g=fgetc(imm);
nuovo->b=fgetc(imm);
nuovo->succ=NULL;
if(ultimo==NULL)
{
inizio=nuovo;
}
else
{
ultimo->succ=nuovo;
}
ultimo=nuovo;
j++;
nuovo=NULL;
}
for(i=0;i<(width%4);i++)
{
trash=fgetc(imm); //Elimina i bytes di padding per ogni riga
}
z++;
}
cout<<"Fatto!"<<endl;
nuovo=inizio;
//x parte da zero
cout<<"Inizio scrittura della nuova immagine sul file 'copia.bmp'... ";
start=clock(); //da qui prendo inzia il conteggio
while(nuovo!=NULL) //scrittura nuova immagine
{
fwrite(&(nuovo->r),sizeof(char),1,ris); //stampiamo i 3 bytes relativi al pixel
fwrite(&(nuovo->g),sizeof(char),1,ris);
fwrite(&(nuovo->b),sizeof(char),1,ris);
if(((width%4)!=0)&&(x==(width-1)))
{
for(j=0;j<(width%4);j++)
{
fwrite(&padding,sizeof(char),1,ris); //scrivo il pixel di padding width%4 volte
}
x=0;
}
else
{
x++;
}
bin=nuovo;
nuovo=nuovo->succ; //sposto il puntatore al successivo pixel
delete bin;
i++;
}
cout<<"Fatto!"<<endl;
end=clock(); //qui finisce il conteggio
diff=((double)(end-start))/CLOCKS_PER_SEC;
cout<<"Tempo di esecuzione per la scrittura dell'immagine "<<diff<<" secondi"<<endl;
cout<<"i: "<<i<<endl;
cout<<"x: "<<x<<endl;
}
fclose(imm); //chiudo i 2 file
fclose(ris);
system("PAUSE");
return 0;
}
Compilando in Release e il tempo di esecuzione è 17.812 secondi, mentre compilando in Debug il tempo di esecuzione è 18.39