{"id":2358,"date":"2026-04-30T11:35:53","date_gmt":"2026-04-30T10:35:53","guid":{"rendered":"https:\/\/coding4phone.com\/?p=2358"},"modified":"2026-04-30T11:37:16","modified_gmt":"2026-04-30T10:37:16","slug":"mapsui-5-afficher-des-icones-personnalisees-sur-la-carte-avec-pintype-imagesource","status":"publish","type":"post","link":"https:\/\/coding4phone.com\/?p=2358","title":{"rendered":"Mapsui 5 \u2014 Afficher des ic\u00f4nes personnalis\u00e9es sur la carte avec PinType.ImageSource"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/github.com\/Mapsui\/Mapsui\" target=\"_blank\" rel=\"noreferrer noopener\">Mapsui 5<\/a> introduit une rupture importante dans la fa\u00e7on dont les images sont g\u00e9r\u00e9es. Si tu migres depuis la version 4, tu as s\u00fbrement rencontr\u00e9 des erreurs li\u00e9es \u00e0 <code>BitmapId<\/code>, <code>BitmapRegistry<\/code> ou <code>SymbolStyle<\/code>, des APIs d\u00e9sormais obsol\u00e8tes ou supprim\u00e9es. Cet article fait le point sur le nouveau syst\u00e8me, et montre comment l&rsquo;utiliser concr\u00e8tement pour afficher des pins personnalis\u00e9s sur une carte .NET MAUI.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"le-nouveau-systeme-dand39images-dans-mapsui-5\">Le nouveau syst\u00e8me d&rsquo;images dans Mapsui 5<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Avant la version 5, afficher une image personnalis\u00e9e sur la carte n\u00e9cessitait de charger manuellement le bitmap, de l&rsquo;enregistrer dans un <code>BitmapRegistry<\/code>, de r\u00e9cup\u00e9rer un <code>BitmapId<\/code> entier, et de l&rsquo;affecter \u00e0 un <code>SymbolStyle<\/code>. C&rsquo;\u00e9tait fonctionnel, mais verbeux et peu intuitif.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Mapsui 5 simplifie tout \u00e7a avec un syst\u00e8me bas\u00e9 sur des <strong>URI de type cha\u00eene<\/strong>. Tu sp\u00e9cifies l&rsquo;image via une simple propri\u00e9t\u00e9 <code>string<\/code>, et Mapsui s&rsquo;occupe du chargement, du cache et du rendu. Plus besoin de g\u00e9rer le cycle de vie des bitmaps manuellement.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ce syst\u00e8me est unifi\u00e9 : il s&rsquo;applique aussi bien aux <code>Pin<\/code>, aux <code>ImageStyle<\/code>, aux <code>ButtonWidget<\/code>, etc.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"les-cinq-schemas-dand39uri-supportes\">Les cinq sch\u00e9mas d&rsquo;URI support\u00e9s<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Mapsui 5 supporte cinq fa\u00e7ons de r\u00e9f\u00e9rencer une image.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"1-https-ou-http--image-distante\">1. <code>https:\/\/<\/code> ou <code>http:\/\/<\/code>  image distante<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">L&rsquo;image est t\u00e9l\u00e9charg\u00e9e depuis un serveur distant. Pratique pour des ic\u00f4nes dynamiques ou h\u00e9berg\u00e9es, mais d\u00e9pend de la connectivit\u00e9 r\u00e9seau.<\/p>\n\n\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\npin.ImageSource = &quot;&lt;a href=&quot;https:\/\/example.com\/icons\/mymarker.png&amp;quot;&quot;&gt;https:\/\/example.com\/icons\/mymarker.png&quot;&lt;\/a&gt;;\n<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"2-file--fichier-local\">2. <code>file:\/\/<\/code> fichier local<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Pointe vers un fichier pr\u00e9sent sur le syst\u00e8me de fichiers de l&rsquo;appareil. Utile pour des images t\u00e9l\u00e9charg\u00e9es ou g\u00e9n\u00e9r\u00e9es \u00e0 l&rsquo;ex\u00e9cution.<\/p>\n\n\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nvar localPath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);\npin.ImageSource = $&quot;file:\/\/{localPath}\/icons\/mymarker.png&quot;;\n<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"3-embedded--ressource-embarquee-dans-land39assembly\">3. <code>embedded:\/\/<\/code> ressource embarqu\u00e9e dans l&rsquo;assembly<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">C&rsquo;est le sch\u00e9ma le plus courant pour des images packag\u00e9es avec l&rsquo;application. L&rsquo;image doit \u00eatre une ressource embarqu\u00e9e .NET classique (voir la section sur le pi\u00e8ge MAUI plus bas).<\/p>\n\n\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\npin.ImageSource = &quot;embedded:\/\/MonApp.Resources.Images.mymarker.svg&quot;;\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Le format du chemin suit la convention .NET pour les ressources embarqu\u00e9es : <code>NomAssembly.Dossier.SousDossier.fichier.ext<\/code>, avec des points comme s\u00e9parateurs.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"4-svg-content--svg-inline\">4. <code>svg-content:\/\/<\/code> SVG inline<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Permet de passer directement le contenu XML d&rsquo;un SVG sous forme de cha\u00eene. Tr\u00e8s utile pour des ic\u00f4nes g\u00e9n\u00e9r\u00e9es dynamiquement ou pour \u00e9viter de g\u00e9rer des fichiers s\u00e9par\u00e9s.<\/p>\n\n\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nvar svgContent = &quot;&quot;&quot;\n    &lt;svg xmlns=&quot;http:\/\/www.w3.org\/2000\/svg&quot; width=&quot;36&quot; height=&quot;36&quot;&gt;\n        &lt;circle cx=&quot;18&quot; cy=&quot;18&quot; r=&quot;16&quot; fill=&quot;#E63946&quot;\/&gt;\n    &lt;\/svg&gt;\n    &quot;&quot;&quot;;\npin.ImageSource = $&quot;svg-content:\/\/{svgContent}&quot;;\n<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"5-base64-content--image-encodee-en-base64\">5. <code>base64-content:\/\/<\/code> image encod\u00e9e en base64<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Permet d&rsquo;int\u00e9grer n&rsquo;importe quelle image (PNG, JPEG, SVG\u2026) directement dans la cha\u00eene, sans fichier externe. Id\u00e9al quand l&rsquo;image provient d&rsquo;une API, d&rsquo;une base de donn\u00e9es, ou quand tu veux \u00e9viter tout probl\u00e8me de chemin.<\/p>\n\n\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nbyte&#x5B;] imageBytes = File.ReadAllBytes(&quot;mymarker.png&quot;);\nstring base64 = Convert.ToBase64String(imageBytes);\npin.ImageSource = $&quot;base64-content:\/\/{base64}&quot;;\n<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"utiliser-pintypeimagesource-en-pratique\">Utiliser <code>PinType.ImageSource<\/code> en pratique<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">L&rsquo;objet <code>Pin<\/code> de <code>Mapsui.UI.Maui<\/code> expose une propri\u00e9t\u00e9 <code>Type<\/code> de type <code>PinType<\/code>. Quand cette valeur est <code>PinType.ImageSource<\/code>, Mapsui utilise directement la propri\u00e9t\u00e9 <code>ImageSource<\/code> pour rendre l&rsquo;ic\u00f4ne. Si <code>ImageSource<\/code> est <code>null<\/code> ou vide, une <code>InvalidOperationException<\/code> est lev\u00e9e au moment du rendu.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Voici un exemple complet :<\/p>\n\n\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nvar pin = new Pin\n{\nLabel = &quot;Mon point d&#039;int\u00e9r\u00eat&quot;,\nPosition = new Position(45.188, 5.724),\nType = PinType.ImageSource,\nImageSource = &quot;embedded:\/\/MonApp.Resources.Images.mymarker.svg&quot;,\nScale = 1.0f,\nIsVisible = true\n};\n\nmapView.Pins.Add(pin);\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Si tu veux utiliser une couleur de teinte (<code>blending<\/code>) sur l&rsquo;ic\u00f4ne, note que cela n&rsquo;est disponible qu&rsquo;avec <code>PinType.Pin<\/code> (le pin SVG int\u00e9gr\u00e9 de Mapsui). Avec <code>PinType.ImageSource<\/code>, l&rsquo;image est rendue telle quelle.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"\u26a0\ufe0f-le-piege-maui--embeddedresource-vs-mauiimage\">\u26a0\ufe0f Le pi\u00e8ge MAUI : <code>EmbeddedResource<\/code> vs <code>MauiImage<\/code><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">C&rsquo;est le point qui fait perdre le plus de temps lors d&rsquo;une migration vers Mapsui 5 sur .NET MAUI.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dans un projet MAUI, les images plac\u00e9es dans <code>Resources\/Images<\/code> ont par d\u00e9faut la <em>Build Action<\/em> <strong><code>MauiImage<\/code><\/strong>. Cette action de compilation les transforme et les int\u00e8gre dans les ressources natives de chaque plateforme (Android drawable, iOS asset catalog, etc.). Elles <strong>ne sont pas<\/strong> accessibles comme ressources embarqu\u00e9es .NET.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Le sch\u00e9ma <code>embedded:\/\/<\/code> de Mapsui attend des <strong>ressources embarqu\u00e9es .NET classiques<\/strong>, c&rsquo;est-\u00e0-dire des fichiers compil\u00e9s avec la <em>Build Action<\/em> <strong><code>EmbeddedResource<\/code><\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Ce qu&rsquo;il faut faire :<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Ajouter l&rsquo;image \u00e0 ton projet (par exemple dans un dossier <code>Assets\/Icons\/<\/code>)<\/li>\n\n\n\n<li>Dans les propri\u00e9t\u00e9s du fichier, changer la <em>Build Action<\/em> de <code>MauiImage<\/code> \u00e0 <strong><code>EmbeddedResource<\/code><\/strong><\/li>\n\n\n\n<li>Utiliser le chemin complet avec le nom de l&rsquo;assembly<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Comment trouver le nom exact de la ressource ?<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Le nom g\u00e9n\u00e9r\u00e9 peut varier selon la structure de ton projet. Pour le trouver avec certitude, utilise ce snippet au d\u00e9marrage de l&rsquo;application :<\/p>\n\n\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nvar names = System.Reflection.Assembly\n.GetExecutingAssembly()\n.GetManifestResourceNames();\n\nforeach (var name in names)\nSystem.Diagnostics.Debug.WriteLine(name);\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Tu verras dans la console de d\u00e9bogage des noms du type :<\/p>\n\n\n<div class=\"wp-block-code\">\n\t<div class=\"cm-editor\">\n\t\t<div class=\"cm-scroller\">\n\t\t\t\n<pre>\n<code><div class=\"cm-line\">MonApp.Assets.Icons.mymarker.svg<\/div><div class=\"cm-line\">MonApp.Assets.Icons.otherpoi.png<\/div><\/code><\/pre>\n\t\t<\/div>\n\t<\/div>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">C&rsquo;est exactement ce que tu dois passer \u00e0 <code>embedded:\/\/<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"quelle-alternative-si-embedded-pose-probleme-\">Quelle alternative si <code>embedded:\/\/<\/code> pose probl\u00e8me ?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Si tu ne veux pas te soucier des <em>Build Actions<\/em> ou de la structure de ressources, le sch\u00e9ma <strong><code>base64-content:\/\/<\/code><\/strong> est une excellente alternative. Tu charges l&rsquo;image une seule fois (depuis un stream, une ressource MauiImage via <code>ImageSource<\/code>, une API\u2026), tu l&rsquo;encodes en base64, et tu passes la cha\u00eene directement.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">C&rsquo;est l\u00e9g\u00e8rement moins \u00e9l\u00e9gant mais totalement fiable, quelle que soit la configuration du projet.<\/p>\n\n\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\n\/\/ Exemple : image lue depuis un stream quelconque\nusing var stream = await FileSystem.OpenAppPackageFileAsync(&quot;mymarker.png&quot;);\nusing var ms = new MemoryStream();\nawait stream.CopyToAsync(ms);\nstring base64 = Convert.ToBase64String(ms.ToArray());\npin.ImageSource = $&quot;base64-content:\/\/{base64}&quot;;\n<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"resume\">R\u00e9sum\u00e9<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Sch\u00e9ma<\/th><th>Usage typique<\/th><\/tr><\/thead><tbody><tr><td><code>https:\/\/<\/code><\/td><td>Ic\u00f4ne h\u00e9berg\u00e9e en ligne<\/td><\/tr><tr><td><code>file:\/\/<\/code><\/td><td>Fichier local g\u00e9n\u00e9r\u00e9\/t\u00e9l\u00e9charg\u00e9<\/td><\/tr><tr><td><code>embedded:\/\/<\/code><\/td><td>Ressource embarqu\u00e9e .NET (<code>EmbeddedResource<\/code>)<\/td><\/tr><tr><td><code>svg-content:\/\/<\/code><\/td><td>SVG g\u00e9n\u00e9r\u00e9 dynamiquement<\/td><\/tr><tr><td><code>base64-content:\/\/<\/code><\/td><td>Image de toute provenance, z\u00e9ro probl\u00e8me de chemin<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Le nouveau syst\u00e8me d&rsquo;images de Mapsui 5 est beaucoup plus simple \u00e0 utiliser que l&rsquo;ancien <code>BitmapRegistry<\/code>, \u00e0 condition de comprendre les subtilit\u00e9s li\u00e9es aux ressources .NET MAUI. Une fois ce point ma\u00eetris\u00e9, afficher des ic\u00f4nes personnalis\u00e9es sur une carte devient v\u00e9ritablement trivial.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Mapsui 5 introduit une rupture importante dans la fa\u00e7on dont les images sont g\u00e9r\u00e9es. Si tu migres depuis la version 4, tu as s\u00fbrement rencontr\u00e9 des erreurs li\u00e9es \u00e0 BitmapId, BitmapRegistry ou SymbolStyle, des APIs d\u00e9sormais obsol\u00e8tes ou supprim\u00e9es. Cet article fait le point sur le nouveau syst\u00e8me, et montre comment l&rsquo;utiliser concr\u00e8tement pour afficher &#8230; <a title=\"Mapsui 5 \u2014 Afficher des ic\u00f4nes personnalis\u00e9es sur la carte avec PinType.ImageSource\" class=\"read-more\" href=\"https:\/\/coding4phone.com\/?p=2358\" aria-label=\"En savoir plus sur Mapsui 5 \u2014 Afficher des ic\u00f4nes personnalis\u00e9es sur la carte avec PinType.ImageSource\">Lire la suite<\/a><\/p>\n","protected":false},"author":1,"featured_media":2370,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"advanced_seo_description":"D\u00e9couvrez le nouveau syst\u00e8me d'images dans Mapsui 5 pour g\u00e9rer facilement vos ic\u00f4nes personnalis\u00e9es sur .NET MAUI. Simplifiez votre migration !","jetpack_seo_html_title":"Nouveau syst\u00e8me d'images dans Mapsui 5 : Guide complet","jetpack_seo_noindex":false,"jetpack_seo_schema_type":"","_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_wpcom_ai_launchpad_first_post":false,"_jetpack_hide_featured_image":false,"_jetpack_featured_image_duplicate_dismissed":0,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"_wpas_customize_per_network":false,"jetpack_post_was_ever_published":false},"categories":[8],"tags":[],"class_list":["post-2358","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dotnet"],"jetpack_publicize_connections":[],"jetpack_likes_enabled":true,"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/pfoe4s-C2","jetpack-related-posts":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/coding4phone.com\/wp-content\/uploads\/2026\/04\/coding-4-phone-69f32fe8213e3.png?fit=1024%2C1024&ssl=1","_links":{"self":[{"href":"https:\/\/coding4phone.com\/index.php?rest_route=\/wp\/v2\/posts\/2358","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/coding4phone.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/coding4phone.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/coding4phone.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/coding4phone.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2358"}],"version-history":[{"count":15,"href":"https:\/\/coding4phone.com\/index.php?rest_route=\/wp\/v2\/posts\/2358\/revisions"}],"predecessor-version":[{"id":2375,"href":"https:\/\/coding4phone.com\/index.php?rest_route=\/wp\/v2\/posts\/2358\/revisions\/2375"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/coding4phone.com\/index.php?rest_route=\/wp\/v2\/media\/2370"}],"wp:attachment":[{"href":"https:\/\/coding4phone.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2358"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/coding4phone.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2358"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/coding4phone.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2358"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}