Écrire un fichier image JPG en C
Je lire fichier d'image JPEG et de stocker le nombre de bits dans un fichier texte. Maintenant, je veux revenir à l'image JPEG à l'aide de ces bits dans le fichier texte. J'ai essayé d'écrire un fichier binaire, mais il n'est pas en mesure de récupérer le fichier de l'image.
Merci de m'orienter dans la bonne direction. Je suis busting ma tête en ce pour un couple de jours, mais pas de chance jusqu'à présent.
Voici mon code pour l'écriture de fichier JPG:
int length;
unsigned char *inData;
char Buffer[9];
int c = 0, x;
/* file.txt has single bit per line. */
FILE *reader = fopen(file.txt, "r");
FILE *writer = fopen("output.JPG","wb");
fseek(reader, 0, SEEK_END);
length=ftell(reader);
fseek(reader, 0, SEEK_SET);
for(x=0; x < length; x++){
fscanf(reader, "%d", &inData);
if(c <= 8){ /* reading 8-bits */
Buffer[c] = inData;
} else {
fwrite(&Buffer, sizeof(Buffer), 1, writer);
c = 0;
}
c++;
}
fclose(reader);
fclose(writer);
Voici l'extrait de code pour la lecture input.JPG et l'écriture de ses bits à file.txt
char *buffer;
int fileLen;
FILE *file = fopen("inputIM.JPG", "rb");
fseek(file, 0, SEEK_END);
fileLen=ftell(file);
fseek(file, 0, SEEK_SET);
buffer=(char *)malloc(fileLen+1);
fread(buffer, fileLen, 1, file);
fclose(file);
convertToBit(&buffer, fileLen);
free(buffer);
}
//convert buffer data to bits and write them to a text file
convertToBit(void *buffer, int length)
{
int c=0;
int SIZE = length * 8;
unsigned char bits[SIZE + 1];
unsigned char mask = 1;
unsigned char byte ;
int i = 0;
FILE *bitWRT = fopen("file.txt", "w");
for (c=0;c<length;c++)
{
byte = ((char *)&buffer)[c];
for(i = 0; i < 8; i++){
bits[i] = (byte >> i) & mask;
fprintf(bitWRT, "%d\n", bits[i]);
}
}
fclose(bitWRT);
}
Merci,
-Sam
"Stocker ses bits"? Pouvez-vous nous montrer votre code où vous êtes la lecture de votre image jpeg et de l'écrire dans un fichier texte?
Sans voir ton code, nous ne pouvons pas vous dire ce que vous faites mal. Ma suggestion serait de comparer l'original du fichier d'entrée et le fichier de sortie, de découvrir d'où les différences de laïcs.
J'ai ajouté de l'extrait de code. output.JPG est une corruption de fichier image. Où en Suis-je arriver de mal.
Êtes-vous sûr que vous l'écriture de bits et pas de caractères ?
En fait vous êtes en train de rédiger 9 caractères de 8 bits (voir fwrite) et vous incrémenter c variable d'après vous le réglez à 0. En outre, vous lire en utilisant le nombre d'octets, mais même le caractère de nouvelle ligne(s) sont comptés comme des octets. C'est un peu bordélique...
Sans voir ton code, nous ne pouvons pas vous dire ce que vous faites mal. Ma suggestion serait de comparer l'original du fichier d'entrée et le fichier de sortie, de découvrir d'où les différences de laïcs.
J'ai ajouté de l'extrait de code. output.JPG est une corruption de fichier image. Où en Suis-je arriver de mal.
Êtes-vous sûr que vous l'écriture de bits et pas de caractères ?
En fait vous êtes en train de rédiger 9 caractères de 8 bits (voir fwrite) et vous incrémenter c variable d'après vous le réglez à 0. En outre, vous lire en utilisant le nombre d'octets, mais même le caractère de nouvelle ligne(s) sont comptés comme des octets. C'est un peu bordélique...
OriginalL'auteur Sam | 2012-05-10
Vous devez vous connecter pour publier un commentaire.
Essayer de réécrire comme suit (veuillez noter qu'il est très naïf et non mise en œuvre):
Hypothèse: chaque ligne de votre fichier d'entrée est un seul peu du fichier d'origine (c'est à dire que si le fichier d'origine est, par exemple, 1024 octets, alors vous aurez 1024 * 8 = 8192 lignes dans le fichier texte). A noter qu'en raison de la ligne des terminaisons et (éventuellement) les différents encodages la longueur totale du fichier sera plus grande (au moins le double).
MODIFIER
Pour écrire, vous pouvez utiliser quelque chose comme ceci:
pouvez-vous fournir le code que vous utilisez pour écrire le fichier texte?
J'ai ajouté un extrait de code pour la lecture d'une image d'entrée de fichiers et la conversion en morceaux. Merci de m'aider
actuellement, vous n'êtes pas de la rédaction de votre fichier JPEG mais aléatoire personnel, voir la ligne: octets = ((char *)&tampon)[c];
comment il devrait être? Pouvez-vous veuillez la corriger.
OriginalL'auteur Adriano Repetti
Il y a une chose importante qui doit être considéré, chaque fichier a, au début, un en-tête et à la fin, un pied de page. Le format de l'en-tête est FF D8, donc si vous suffit d'écrire dans le fichier, vous pouvez endommager les cet en-tête et le fichier sera corrompu.
Une autre chose importante, si vous voulez lire un imagem fichier, avez-vous déjà essayé de le faire avec le mode binaire à l'aide de fread () et fwrite au lieu d'essayer de lire du contenu avec une fonction qui a été initialement conçu pour lire/écrire des caractères? (Je ne sais pas, peut-être que je suis en train de dire quelque chose de stupide ici, mais je voudrais donner un coup de feu)
Désolé pour mon mauvais anglais btw....
OriginalL'auteur UserX