|
|
|
|
||||||
![]() |
|
|
LinkBack | Outils de la discussion |
|
|
#1 |
|
Messages: n/a
Hébergeur: |
Bonsoir,
J'ai des fichiers jpeg dont certains correspondent à des images en niveau de gris. Je voudrais déterminer les fichiers concernés sans devoir charger l'image complète. En cherchant dans les archives, j'ai déjà trouvé un code qui lit directement les largeurs et hauteurs dans l'en-tête. Mais rien sur l'aspect couleur<>noir et blanc. Si vous avez des idées... Eric |
|
|
|
#2 |
|
Messages: n/a
Hébergeur: |
Eric S a écrit :
> Bonsoir, > > J'ai des fichiers jpeg dont certains correspondent à des images en > niveau de gris. Je voudrais déterminer les fichiers concernés sans > devoir charger l'image complète. En cherchant dans les archives, j'ai > déjà trouvé un code qui lit directement les largeurs et hauteurs dans > l'en-tête. Mais rien sur l'aspect couleur<>noir et blanc. > > Si vous avez des idées... > > Eric A la sauvegarde d'une image scannée en dégradé de gris, Paint Shop Pro signale qu'il doit la convertir en 32 bits pour pouvoir la sauver en jpg/jpeg. J'en conclus que le JPG est forcément en 32 bits et qu'en conséquence il n'y a probablement de descripteur pour indiquer qu'elle n'exploite que des gris. |
|
|
|
#3 |
|
Messages: n/a
Hébergeur: |
Ben justement, si, ça ne doit pas être pareil. Parce que quand je les
lis avec Intel Jpeg Library, ça ne marche pas avec celles en niveaux de gris. De plus, The Gimp ne me demande pas de reconvertir en RVB pour les enregistrer. Et à la ré-ouverture, elles sont toujours en niveaux de gris. Normalement, il y a quelque part dans l'entête jpeg un byte qui dit : number of components (1 = grayscale, 3 = RGB) Pour revenir à mes recherches précédentes, j'avais pris le code que Dav999 avait mis le 23.04.2004 à 18:46:09 sur le newsgroup. Ça lisait largeur et hauteur. En prenant le byte d'après, ça me fait aussi le 1 ou 3 de la couleur. Sauf que le code donne des résultats erronés pour largeur/hauteur dans certains cas. Donc, en plus, je veux de nouveau largeur et hauteur. Je continue mes recherches... Eric |
|
|
|
#4 |
|
Messages: n/a
Hébergeur: |
Eric S a écrit :
> Ben justement, si, ça ne doit pas être pareil. Parce que quand je les > lis avec Intel Jpeg Library, ça ne marche pas avec celles en niveaux de > gris. De plus, The Gimp ne me demande pas de reconvertir en RVB pour les > enregistrer. Et à la ré-ouverture, elles sont toujours en niveaux de gris. > > Normalement, il y a quelque part dans l'entête jpeg un byte qui dit : > > number of components (1 = grayscale, 3 = RGB) > > > Pour revenir à mes recherches précédentes, j'avais pris le code que > Dav999 avait mis le 23.04.2004 à 18:46:09 sur le newsgroup. Ça lisait > largeur et hauteur. En prenant le byte d'après, ça me fait aussi le 1 ou > 3 de la couleur. Sauf que le code donne des résultats erronés pour > largeur/hauteur dans certains cas. Donc, en plus, je veux de nouveau > largeur et hauteur. > > Je continue mes recherches... > > Eric Errare humanum est (mais sans persévérer) : il y a bien un marqueur pour avoir si la composante Y (=luminosité = niveau de gris) est seule ou accompagnée de Cb et Cr (données sur couleurs) Voici la description du début d'un fichier JPEG, tiré de la description de fichier trouvée sur www.wotsit.org (jfif.zip): <<< The syntax of a JFIF file conforms to the syntax for interchange format defined in Annex B of ISO DIS 10918-1. In addition, a JFIF file uses APP0 marker segments and constrains certain parameters in the frame header as defined below. X'FF', SOI X'FF', APP0, length, identifier, version, units, Xdensity, Ydensity, Xthumbnail, Ythumbnail, (RGB)n length (2 bytes) Total APP0 field byte count, including the byte count value (2 bytes), but excluding the APP0 marker itself identifier (5 bytes) = X'4A', X'46', X'49', X'46', X'00' This zero terminated string ("JFIF") uniquely identifies this APP0 marker. This string shall have zero parity (bit 7=0). version (2 bytes) = X'0102' The most significant byte is used for major revisions, the least significant byte for minor revisions. Version 1.02 is the current released revision. units (1 byte) Units for the X and Y densities. units = 0: no units, X and Y specify the pixel aspect ratio units = 1: X and Y are dots per inch units = 2: X and Y are dots per cm Xdensity (2 bytes) Horizontal pixel density Ydensity (2 bytes) Vertical pixel density Xthumbnail (1 byte) Thumbnail horizontal pixel count Ythumbnail (1 byte) Thumbnail vertical pixel count (RGB)n (3n bytes) Packed (24-bit) RGB values for the thumbnail pixels, n = Xthumbnail * Ythumbnail [ Optional JFIF extension APP0 marker segment(s) - see below ] o o o X'FF', SOFn, length, frame parameters Number of components Nf = 1 or 3 1st component C1 = 1 = Y component 2nd component C2 = 2 = Cb component 3rd component C3 = 3 = Cr component o o o X'FF', EOI >>> |
|
|
|
#5 |
|
Messages: n/a
Hébergeur: |
> Voici la description du début d'un fichier JPEG, tiré de la description
> de fichier trouvée sur www.wotsit.org (jfif.zip): Ça faisait un moment que je n'avais pas trainé sur ce site. J'ai téléchargé une autre doc : itu-1150PDF.zip Ça m'a permis de comprendre comment étaient organisées les frames dans les fichiers jpeg et en particulier de retrouver celle contenant les informations qui m'intéressaient. En m'inspirant du code déjà trouvé, ça donne le code mis à la fin. Je vais encore faire quelques tests pour vérifier que c'est bon mais à priori, c'est bon. Merci Éric /***********************/ function JPEGDimensions2(Filename : string; var X, Y : Word; var Colored : boolean) : boolean; var W : word; b : byte; found : boolean; begin Result := False; with TFileStream.Create(filename, fmOpenRead or fmShareDenyNone) do begin try Position := 0; Read(W, 2); if (W <>$D8FF) then exit; found := false; repeat read(b,1); if b<>$FF then begin while b=0 do // in some jpeg from Photoshop there is a bunch of $00 at the end of the frame before the next frame header read(b,1); if b<>$FF then exit; end; read(b,1); if (b in [$C0, $C1, $C2]) then begin // found, reading values found := true; Position:=Position+3; Read(Y, 2); Read(X, 2); X := Swap(X); Y := Swap(Y); read(b,1); Colored:=(b=3); end else begin // not found, going to next frame header read(W,2); W :=swap(W); Position:= Position + W - 2; end; until found; Result := true; finally Free; end; {try} end; {with} end; {JPEGDimensions2} |
|
![]() |
| Outils de la discussion | |
|
|