[VirtualEarth] Image au format de pixel indexé et GDI+
Fin septembre 2008 est apparue la première version du web service VirtualEarth. Ce dernier fournit différents types de services dont le service d'imagerie. Le service d'imagerie permet de récupérer des informations par rapport aux images utilisées dans le contrôle AJAX VirtualEarth comme par exemple l'url des images. Il est également possible de demander au service de positionner des punaises sur une image avant que ce dernier nous renvoie cette même image. Cette fonctionnalité est intéressante et il n'est malheuresement pas encore possible de demander au service de nous positionner d'autres types d'élements graphiques, je pense notamment à des cercles, des polygones, etc. Pour ce faire, il faut donc nous même dessiner sur l'image les éléments souhaités en utilisant GDI+ et sa fameuse classe Graphics. En effet cette dernière possède une méthode statique FromImage prenant en paramètre un objet de type Image et retournant un objet de type Graphics permettant de tracer différents types d'éléments sur l'image.
Si on consulte la page msdn de la méthode FromImage (http://msdn.microsoft.com/en-us/library/system.drawing.graphics.fromimage.aspx) on s'aperçoit que cette dernière ne supporte par les images au format de pixel indexé, i.e. les images où les couleurs sont gérées via une tablette de couleurs indexée, ainsi que quelques autres types d'image. Or il m'est arrivé plusieurs fois lors du développement d'une application utilisant le service d'imagerie VirtualEarth de récupérer une image ayant un format non pris en charge par cette méthode et de tomber face à l'exception : "A Graphics object cannot be created from an image that has an indexed pixel format". Dans cette situation, la seule solution consiste a créer une nouvelle image avec un format pris en charge par la méthode FromImage et de copier l'ancienne image dans cette nouvelle image. Voici la méthode que j'ai utilisé :
1: private Image CheckImagePixelFormat(Image image)
2: {
3: if (image.PixelFormat == PixelFormat.Format1bppIndexed ||
4: image.PixelFormat == PixelFormat.Format4bppIndexed ||
5: image.PixelFormat == PixelFormat.Format8bppIndexed ||
6: image.PixelFormat == PixelFormat.DontCare ||
7: image.PixelFormat == PixelFormat.Undefined ||
8: image.PixelFormat == PixelFormat.Format16bppArgb1555 ||
9: image.PixelFormat == PixelFormat.Format16bppGrayScale)
10: {
11: Bitmap correcter = new Bitmap(image.Width, image.Height);
12: Graphics g = Graphics.FromImage(correcter);
13: g.DrawImage(image, 0, 0);
14: g.Dispose();
15: return correcter;
16: }
17:
18: return image;
19: }
Could help... ;)
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :