Comment obtenir la largeur/hauteur de fichier jpeg sans l'aide de la bibliothèque?
Tout d'abord je tiens à dire que j'ai essayé de nombreuses fois pour trouver la réponse en utilisant la recherche google, et j'ai trouvé beaucoup de résultats, mais je ne comprends pas, parce que je ne sais pas l'idée de lire un fichier binaire, et de convertir la valeur Obtenue lisible valeur.
Ce que j'ai essayé de le faire.
unsigned char fbuff[16];
FILE *file;
file = fopen("C:\\loser.jpg", "rb");
if(file != NULL){
fseek(file, 0, SEEK_SET);
fread(fbuff, 1, 16, file);
printf("%d\n", fbuff[1]);
fclose(file);
}else{
printf("File does not exists.");
}
Je veux une explication simple exemple montre comment obtenir la largeur/hauteur de fichier jpeg à partir de sa tête, et puis convertir cette valeur lisible valeur.
Avez-vous les détails de ce qui est contenu dans les fichiers jpeg? Si vous avez, veuillez l'inclure dans votre question. Je doute que votre méthode de travail puisqu'il y a généralement un en-tête au début et puis le réel les valeurs des pixels de départ. Si vous avez seulement besoin de la hauteur et la largeur de l'information, je crois que vous pouvez obtenir que par la lecture de l'en-tête seul.
Je parle
Je comprends cela, mais la question est, savez-vous quel est le format pour les fichiers jpeg? Ou voulez-vous nous de le trouver pour vous ?
C'est la première fois de traiter des fichiers binaires, comme le jpeg, et je ne comprends rien à ce sujet.
Jetez un oeil à cette fastgraph.com/help/jpeg_header_format.html. Il est dit que l'en-tête contient la largeur et la hauteur de l'information à des décalages de 2 et 4 respectivement. Tout ce que vous devez faire est de ce point de l'
Je parle
jpeg files
en général.Je comprends cela, mais la question est, savez-vous quel est le format pour les fichiers jpeg? Ou voulez-vous nous de le trouver pour vous ?
C'est la première fois de traiter des fichiers binaires, comme le jpeg, et je ne comprends rien à ce sujet.
Jetez un oeil à cette fastgraph.com/help/jpeg_header_format.html. Il est dit que l'en-tête contient la largeur et la hauteur de l'information à des décalages de 2 et 4 respectivement. Tout ce que vous devez faire est de ce point de l'
fread
à ces décalages à l'aide de fseek
et lire 2 octets à partir de chaque emplacement. Ensuite, vous avez besoin de convertir ces octets entiers. Lui donner un essai.
OriginalL'auteur Lion King | 2013-08-16
Vous devez vous connecter pour publier un commentaire.
Malheureusement, il ne semble pas être simple pour JPEG. Vous devriez regarder le source de la
jhead
outil de ligne de commande. Il fournit cette information. Lorsque vous allez à travers la source, vous verrez que la fonctionReadJpegSections
. Cette fonction balaie toutes les segments contenus dans le fichier JPEG pour en extraire les informations souhaitées. La largeur de l'image et la hauteur est obtenue lors du traitement des images qui ont unSOFn
marqueur.Je vois la source est dans le domaine public, donc je vais vous montrer le morceau de code qui obtient l'image d'infos:
À partir du code source, il est clair pour moi il n'y a pas une seule "en-tête" avec cette information. Vous devez parcourir le fichier JPEG, analyser chaque segment, jusqu'à ce que vous trouver le segment avec les informations que vous souhaitez. Ceci est décrit dans le article de wikipedia:
Un fichier JPEG est constitué d'une séquence de segments:
Chaque segment commence avec une 2 octets marqueur. Le premier octet est
0xFF
, le deuxième octet détermine le type du segment. Il est suivi par un codage de la longueur du segment. Dans le segment de données spécifiques à ce type de segment.La largeur de l'image et la hauteur est trouvé dans un segment de type
SOFn
, ou "Démarrage de la trame [n]", où "n" est un nombre qui signifie quelque chose de spécial à un décodeur JPEG. Il devrait être assez bon pour le look que pour unSOF0
, et ses octet désignation est0xC0
. Une fois que vous trouverez ce cadre, vous pouvez décoder de manière à trouver l'image en hauteur et en largeur.De sorte que la structure d'un programme à faire ce que vous voulez ressemblerait à:
C'est essentiellement la structure des Michael de Petrov
get_jpeg_size()
de la mise en œuvre.Merci, mais je ne le comprends pas, je veux une manière très simple et exemple, pour la comprendre.
Je serais très heureux que la raison du bas de vote. Merci!
Je suis tellement désolé mais ce n'est survenu accidentellement(à tort), pardonnez-moi.
Il n'y a vraiment pas de problème. Juste pour info, en bas de votes sont totalement anonymes, donc il n'y a aucun moyen pour moi de savoir qui a voté pour moi. Je voulais juste une raison afin que je puisse améliorer la réponse.
OriginalL'auteur jxh
ensuite, vous devez trouver la hauteur et la largeur de marqueur de jpeg, qui est [ffc0].
après la découverte d'ffc0 en binaire, le formiate, le quatre,cinq octets sont de taille et de six et sept octets sont de largeur.
OriginalL'auteur user3614789
la question est ancienne et les autres réponses sont correctes, mais leur format n'est pas le plus facile. Je viens de l'utiliser
getc
d'obtenir rapidement les dimensions, tout en sautant hors de propos marqueurs (il prend également en charge Progressive Jpeg):S jamais entendu parler d'octets de la farce?
Quand j'ai écrémé wiki entrée sur la spec, je l'ai lu, comme disent les segments seulement octet de bourrage pour l'entropie-données codées, de sorte ff co / ff c2 pourrait se produire dans d'autres charges.
Savez-vous quelque autre moyen plus fiable pour comprendre cette information?
juste pour faire un minimum d'analyse, la lecture de l'enregistrement de tailles et de sauter sur eux jusqu'à ce que vous voyez la ff c0 enregistrement.
OriginalL'auteur user6096479
Voici un code simple que j'ai écrit qui semble fonctionner de manière fiable.
C/C++
?, qu'est-ce queSeek
,Read
fonctions ?, et Quel est l'avantage de cette fonctionMOTOSHORT
?, aussi ce qui estiHandle
variable ?.Le rechercher et de lire des fonctions génériques fichier i/o qui devrait exister dans tous les systèmes. Le MOTOSHORT est une macro (voir en haut de code) ce qui est pratique pour la lecture big endian shorts sur n'importe quel système, indépendamment de l'endianess. Le ihandle variable est le descripteur de fichier est supposé être ouvert avant l'appel de la fonction.
OriginalL'auteur BitBank
OriginalL'auteur Mike
Voici un code que j'ai écrit en Java. Fonctionne très bien pour les jpeg prises à partir d'un appareil photo. Il scanne l'intégralité du code pour trouver la plus grande taille de l'image. Je ne pouvais pas l'améliorer afin de sauter sur la longueur de chaque bloc, car il ne fonctionne pas. Si quelqu'un peut améliorer le code pour le faire ce serait génial.
OriginalL'auteur Guilherme Campos Hazan