2010-10-29 4 views
2

J'ai besoin de convertir des fichiers jpeg et png de 24 et 32 ​​bits à une profondeur de bits inférieure (16). J'ai trouvé du code pour faire cela, mais les images résultantes gardent la profondeur du fichier original bien que la taille du fichier soit inférieure.save jpg avec une profondeur de bits inférieure (24 à 16 par exemple) (C#)

Image img = Image.FromFile(filePathOriginal); 
Bitmap bmp = ConvertTo16bpp(img); 
EncoderParameters parameters = new EncoderParameters(); 
parameters.Param[0] = new EncoderParameter(Encoder.ColorDepth, 16); 
bmp.Save(filePathNew, jpgCodec, parameters); 
bmp.Dispose(); 
img.Dispose(); 

... 

private static Bitmap ConvertTo16bpp(Image img) { 
    var bmp = new Bitmap(img.Width, img.Height, System.Drawing.Imaging.PixelFormat.Format16bppRgb555); 
    using (var gr = Graphics.FromImage(bmp)) 
    { 
     gr.DrawImage(img, new Rectangle(0, 0, img.Width, img.Height)); 
    } 

    return bmp; 
} 

Une idée de ce qui ne va pas?

Merci, Frank

+0

Je doute sérieusement la question. JPEG est un format en trois couleurs. Il a généralement 8 bits par couleur, mais peut avoir 12 ou 16. 24 = 3x8 bits de couleur est donc raisonnable, mais 16 ou 32 est tout simplement impossible. Il ne divise pas par trois. 3x16 = 48 serait possible, mais c'est une profondeur de couleur plus haute. – MSalters

+0

en fait 32bit est possible 3x8 pour la couleur et un 4ème canal pour alpha (transparence) ... avec est stupide cuz jpeg ne supporte pas la transparence –

Répondre

3

JPEG est un format à trois couleurs. Il a généralement 8 bits par couleur, mais peut avoir 12 ou 16. 24 = 3x8 bits de couleur est donc raisonnable, mais 16 ou 32 est tout simplement impossible. Il ne divise pas par trois. 3x16 = 48 serait possible, mais c'est une profondeur de couleur plus élevée. JPEG est conçu pour les photos, et cela n'a pas de sens de prendre en charge des profondeurs de bits inférieures à 3x8. Il n'y a aucun avantage à cela.

Maintenant, ce que est l'image 16 bits dans votre code? C'est une approximation imprécise en mémoire de l'original, en utilisant seulement 65535 couleurs. Lorsque vous enregistrez ce retour, vous obtenez un JPEG 24 bits. Apparemment, votre encodeur JPEG ne sait pas comment créer un JPEG 48 bits. Même si c'était le cas, ce serait un gaspillage de bits puisque l'image en mémoire n'a de toute façon que 65536 couleurs.

En résumé: ce qui ne va pas est la tâche. Il n'y a pas de JPEG couleur 65536.

+0

merci msalters. Je peux suivre la logique de votre réponse. Si je compare l'image originale et convertie, ils ont tous les deux la profondeur de 24 bits, mais la taille de fichier est réduite avec une image de test de 2218 kb à 959 kb. Lorsque je compare la qualité de l'image, il n'y a pas beaucoup de différence, seule la couleur convertie est un peu plus sombre. – Frank

+0

autre différence: avec png, la transparence est perdue – Frank

+0

@Frank: Pas étonnant du côté du PNG, la réduction en mémoire d'un bitmap couleur 65536 supprime le canal alpha. Vous ne pouvez pas le récupérer non plus. Quant à la réduction de la taille JPEG, c'est à prévoir. La réduction à 65536 couleurs éliminera les petites différences de couleur, qui autrement auraient besoin d'être codées. Cependant, la compression JPEG a un facteur de «qualité». Une compression de moindre qualité éliminera également les petits détails, mais éliminera de manière préférentielle les détails pour lesquels l'œil humain est moins sensible. C'est probablement une meilleure alternative à votre problème. – MSalters

2

Cette question est un peu ancienne, mais je vais l'ajouter pour tous ceux qui cherchent dans le futur.

S'il s'agit d'un fichier 32 bits, il est probable qu'il se trouve dans l'espace colorimétrique CMJN. Ceci est généralement utilisé pour l'impression, mais il est assez rare que de nombreux outils qui utilisent RVB et afficher sur les écrans plutôt que d'impression ne peuvent pas le gérer.

Vous pouvez le convertir en RVB avec ImageMagic:

convert imageInCMYK.jpg -colorspace RGB imageInRGB.jpg 
Questions connexes