2013-01-23 4 views
3

Nous avons un système qui fournit des images en niveaux de gris 8 bits, soit en formats tiff ou jpg. Cependant, le composant que nous devons traiter les images s'attend à ce que l'image soit au format jpg 8 bits.Conversion d'une image tiff en niveaux de gris 8 bits en jpg en niveaux de gris 8 bits dans .Net 2.0

Lorsque j'utilise .Net pour enregistrer les images tiff au format jpg, il les convertit en image 24 bits.

Existe-t-il un moyen, heureusement simple et rapide, de convertir les images tiff en niveaux de gris 8 bits en jpg équivalent?

+0

Avez-vous des exemples de fichiers jpg que le composant cible acceptera? Je suppose qu'ils sont aussi des images 24 bits (la norme pour jpg) mais chacun des canaux rouge, vert et bleu contiendra les mêmes données. – ChrisF

+0

Très obscur, GDI + ne le supporte pas. Essayez la classe JpegBitmapEncoder avec une palette BitmapPalettes.Gray256. –

+0

@ChrisF, je ne suis pas un expert en jpg mais c'est ce que Windows et IrfanView me disent. Par exemple, si je vois les propriétés du fichier jpg, je vois la profondeur de bit est 8. Je vais voir si je peux télécharger un exemple d'image quelque part. – TheBlueSky

Répondre

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

...

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

return bmp; 
} 
+0

ColorDepth n'est pas respecté par Image.Save for ImageFormat.Jpeg ... bien qu'élégant et simple, ce code ne fonctionne pas. –

1

J'ai essayé et essayé juste de conclure que je suis désolé: la classe de bibliothèque .Net Bitmap NE PAS enregistrer JPEG 8bpp même si explicitement et les données sont en niveaux de gris . (Remarque: bien que mentionné à certains endroits, le format JPEG supporte 8bpp).

A Convert an image to grayscale vous pouvez trouver code snipet pour convertir en niveaux de gris n'importe quelle image.

En utilisant ce code, j'ai pu enregistrer une instance de niveaux de gris 8bpp d'image avec l'extension « .jpeg », mais indiquant ImageFormat.Gif ... c'est un tricheur ...

Mes résultats montrent que la solution d'un tout une approche différente.

La bibliothèque FreeImage offre des API puissantes, y compris la fonctionnalité nécessaire pour résoudre votre problème.

page d'accueil de Il est à http://freeimage.sourceforge.net/faq.html

Mais, je ne pouvais pas compiler facilement dans ma machine Win2008 + VS 2010.

On devrait beaucoup transpirer pour le faire fonctionner dans des environnements modernes.

Quelques conseils sur la façon d'accomplir que l'on trouve à http://www.sambeauvois.be/blog/2010/05/freeimage-and-x64-projects-yes-you-can/

Bonne chance!

Questions connexes