Notes
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Cet article explique la différence entre les pixels physiques et les pixels indépendants de l’appareil (DIPs) et la façon dont les PPP (points par pouce) sont gérés dans Win2D.
Win2D est conçu de telle sorte que de nombreuses applications puissent ignorer cette distinction, car elle fournit des comportements par défaut sensibles qui feront la bonne chose lors de l’exécution sur des appareils À la fois faible et élevé DPI. Si votre application a des besoins plus spécialisés, ou si vous avez une opinion différente sur ce que signifie « valeur par défaut sensible », lisez les détails de gory...
Qu’est-ce que l’ppp ?
Ppp signifie « points par pouce ». Il s’agit d’une mesure approximative de la densité de pixels d’un affichage de sortie tel qu’un moniteur d’ordinateur ou un écran de téléphone. Plus l’ppp est élevé, plus les points plus petits composent l’affichage.
L’ppp n’est qu’une mesure approximative, car tout le matériel d’affichage ne peut pas être utilisé pour signaler des informations précises. Certains moniteurs d’ordinateur ne signalent pas d’ppp au système d’exploitation du tout, ou l’utilisateur a peut-être configuré son système pour effectuer le rendu à l’aide d’un autre ppp que le matériel réel (par exemple pour modifier la taille des éléments de texte de l’interface utilisateur). Les applications peuvent utiliser ppp pour choisir la taille des éléments volumineux à dessiner, mais ne doivent pas s’en appuyer comme mesure physique exacte de la taille d’affichage.
Une valeur PPP de 96 est considérée comme une valeur par défaut neutre.
Qu’est-ce qu’un pixel ?
Un pixel est un point de couleur unique. Les images des graphiques d’ordinateur sont constituées de nombreux pixels disposés dans une grille à deux dimensions. Vous pouvez considérer les pixels comme les atomes dont toutes les images sont générées.
La taille physique d’un pixel peut varier considérablement d’un affichage à l’autre. Lorsqu’un ordinateur est connecté à un moniteur à haute résolution ou à un écran externe, les pixels peuvent être assez volumineux, mais sur un téléphone avec un affichage de 1080p seulement quelques pouces sur l’autre, les pixels sont minuscules.
Dans Win2D, chaque fois que vous voyez une API qui spécifie une position ou une taille à l’aide de types de données entiers (ou d’un struct tel que BitmapSize qui contient des entiers), cela signifie que l’API fonctionne en unités de pixels.
La plupart des API Win2D fonctionnent avec des ADRESSES IP plutôt que des pixels.
Qu’est-ce qu’un DIP ?
DIP signifie « pixel indépendant de l’appareil ». Il s’agit d’une unité virtualisée qui peut être identique, supérieure ou inférieure à un pixel physique.
Le rapport entre les pixels et les ADRESSES IP est déterminé par ppp :
pixels = dips * dpi / 96
Lorsque les ppp sont 96, les pixels et les ADRESSES IP sont identiques. Lors de l’utilisation d’un ppp supérieur, un dip unique peut correspondre à plusieurs pixels (ou des parties de pixels dans le cas courant où ppp n’est pas un multiple exact de 96).
La plupart des API Windows Runtime, y compris Win2D, utilisent des ADRESSES IP plutôt que des pixels. Cela présente l’avantage de conserver les graphiques de la même taille physique quelle que soit l’affichage d’une application. Par exemple, si une application spécifie qu’un bouton est large de 100 DIPs, lorsqu’il est exécuté sur un appareil DPI élevé tel qu’un téléphone ou un moniteur 4k, ce bouton sera automatiquement mis à l’échelle pour être de plus de 100 pixels en largeur, de sorte qu’il reste une taille sensible qui est possible pour l’utilisateur de cliquer dessus. Si la taille du bouton a été spécifiée en pixels, d’autre part, elle apparaît ridiculement petite sur ce type d’affichage ppp élevé, de sorte que l’application doit faire plus de travail pour ajuster les dispositions différemment pour chaque type d’écran.
Dans Win2D, chaque fois que vous voyez une API qui spécifie une position ou une taille à l’aide de types de données à virgule flottante (ou structs tels que Vector2 ou Size qui contiennent des valeurs à virgule flottante), cela signifie que l’API fonctionne dans des ADRESSES IP.
Pour effectuer une conversion entre les adresses IP et les pixels, utilisez les méthodes ConvertDipsToPixels(Single, CanvasDpiRounding)
et ConvertPixelsToDips(Int32)
.
Ressources Win2D qui ont ppp
Toutes les ressources Win2D qui contiennent une image bitmap ont également une propriété DPI associée :
CanvasBitmap
CanvasRenderTarget
CanvasSwapChain
CanvasControl
CanvasVirtualControl
CanvasAnimatedControl
CanvasImageSource
Tous les autres types de ressources sont indépendants de DPI. Par exemple, une seule CanvasDevice
instance peut être utilisée pour dessiner sur des contrôles ou des rendertargets de nombreuses DPIs différentes, par conséquent, l’appareil n’a pas d’PPP de son propre.
De même, CanvasCommandList
n’a pas d’ppp, car il contient des instructions de dessin vectoriel plutôt qu’une image bitmap. L’ppp n’entre en jeu que pendant le processus de rastérisation, lorsque la liste de commandes est dessinée sur un rendertarget ou un contrôle (qui ont des ppp).
Contrôle DPI
Les contrôles Win2D (CanvasControl
CanvasVirtualControl
et CanvasAnimatedControl
) utilisent automatiquement le même PPP que l’affichage sur lequel l’application s’exécute. Cela correspond au système de coordonnées utilisé par XAML, CoreWindow et d’autres API Windows Runtime.
Si l’ppp change (par exemple, si l’application est déplacée vers un autre affichage), le contrôle déclenche l’événement CreateResources
et passe un CanvasCreateResourcesReason
de DpiChanged
. Les applications doivent répondre à cet événement en recréant toutes les ressources (telles que rendertargets) qui dépendent de l’ppp du contrôle.
Rendertarget DPI
Les éléments qui peuvent être dessinés sur (qui incluent non seulement CanvasRenderTarget
, mais aussi les types CanvasSwapChain
de type rendertarget et CanvasImageSource
) ont un ppp de leur propre, mais contrairement aux contrôles sur lesquels ces types ne sont pas directement connectés à un affichage, de sorte que Win2D ne peut pas déterminer automatiquement ce que l’ppp doit être. Si vous dessinez vers un rendertarget qui sera copié ultérieurement sur l’écran, vous souhaiterez probablement que ce rendertarget utilise le même ppp que l’écran, mais si vous dessinez à d’autres fins (par exemple, la génération d’images pour le chargement sur un site web) un ppp par défaut de 96 PPP serait plus approprié.
Pour faciliter ces deux modèles d’utilisation, Win2D fournit deux types de surcharge de constructeur :
CanvasRenderTarget(ICanvasResourceCreator, width, height, dpi)
CanvasRenderTarget(ICanvasResourceCreatorWithDpi, width, height)
L’interface ICanvasResourceCreator
est implémentée par CanvasDevice
les contrôles Win2D. Étant donné qu’un appareil n’a pas d’ppp spécifique de son propre, vous devez spécifier explicitement l’ppp lors de la création d’un rendertarget à partir d’un.
Par exemple, pour créer un rendertarget DPI par défaut, où les ADRESSES IP et les pixels sont toujours les mêmes :
const float defaultDpi = 96;
var rtWithFixedDpi = new CanvasRenderTarget(canvasDevice, width, height, defaultDpi);
ICanvasResourceCreatorWithDpi
s’étend en ICanvasResourceCreator
ajoutant une propriété DPI. Cette interface est implémentée par les contrôles Win2D et facilite la création d’un rendertarget qui hérite automatiquement du même PPP que le contrôle à partir duquel il a été créé :
var rtWithSameDpiAsDisplay = new CanvasRenderTarget(canvasControl, width, height);
Ppp bitmap
CanvasBitmap
, contrairement à un rendertarget, n’hérite pas automatiquement d’un ppp d’un contrôle. Les méthodes de création et de chargement de bitmaps incluent des surcharges pour spécifier explicitement le ppp, mais si vous ne le laissez pas, l’ppp bitmap est défini par défaut sur 96, quelle que soit la configuration d’affichage actuelle.
La raison pour laquelle les bitmaps sont différentes d’autres types est qu’elles sont une source de données d’entrée, plutôt qu’une sortie qui sera dessinée sur. Par conséquent, la chose importante pour les bitmaps n’est pas l’emplacement où cette sortie se termine, mais l’ppp de l’image source, qui n’est pas entièrement lié aux paramètres d’affichage actuels.
Si vous chargez une bitmap DPI par défaut de 100 x 100, puis dessinez-la sur un rendertarget, la bitmap sera mise à l’échelle de 100 DIPs à 96 PPP (qui est de 100 pixels) à 100 DIPs au niveau du rendertarget de destination (qui peut être un plus grand nombre de pixels s’il s’agit d’un rendertarget DPI élevé). L’image résultante sera toujours de 100 DIPs de taille (il n’y aura donc aucune surprise de disposition désagréable), mais elle peut subir un flou si une image bitmap source DPI faible a été mise à l’échelle jusqu’à une destination DPI plus élevée.
Pour obtenir une clarté maximale à haute résolution, certaines applications peuvent souhaiter fournir plusieurs ensembles d’images bitmap à différentes résolutions, et au moment du chargement, sélectionnez la version la plus proche de celle du contrôle de destination. D’autres applications peuvent préférer n’expédier que des bitmaps DPI élevées et laisser Win2D effectuer un scale-down lors de l’exécution sur des écrans DPI inférieurs (le scale-down peut souvent être meilleur que le scale-up). Dans les deux cas, l’ppp bitmap peut être spécifié en tant que paramètre à LoadAsync(ICanvasResourceCreator, String, Single)
.
Notez que certains formats de fichier bitmap contiennent des métadonnées PPP propres, mais Win2D ignore cela, car il est souvent défini de manière incorrecte. Au lieu de cela, l’ppp doit être spécifié explicitement lors du chargement de l’image bitmap.
CanvasDrawingSession DPI
CanvasDrawingSession
hérite de son PPP de n’importe quel contrôle, rendertarget, swapchain, etc. il dessine sur.
Par défaut, toutes les opérations de dessin fonctionnent dans des ADRESSES IP. Si vous préférez travailler en pixels, cela peut être modifié via la Units
propriété.
Ppp d’effet
Le pipeline d’effet d’image hérite de son PPP de tout effet CanvasDrawingSession
sur lequel un effet est dessiné. En interne, le traitement des effets fonctionne toujours en pixels. Les valeurs de paramètre telles que les tailles ou les positions sont spécifiées dans les ADRESSES IP, mais ces unités sont converties en pixels avant toute manipulation d’image réelle.
Lorsqu’une bitmap de ppp différent de la session de dessin cible est utilisée comme image source d’effet, un élément interne DpiCompensationEffect
est automatiquement inséré entre la bitmap et l’effet. Cela met à l’échelle la bitmap pour qu’elle corresponde à l’ppp cible, ce qui est généralement ce que vous souhaitez. Si ce n’est pas ce que vous voulez, vous pouvez insérer votre propre instance pour DpiCompensationEffect
personnaliser le comportement.
Remarque
Si vous implémentez un effet personnalisé, envisagez d’appliquer un schéma de gestion DPI équivalent pour garantir un comportement cohérent lorsqu’il est utilisé avec des effets Win2D intégrés.
Composition API
Les Microsoft.Graphics.Canvas.Composition
API fonctionnent à un niveau inférieur aux contrôles XAML Win2D. Ils n’essaient donc pas de gérer automatiquement les PPP en votre nom. C’est à vous de décider quelles unités vous préférez opérer, et de définir les transformations nécessaires pour atteindre cela dans le cadre de votre arborescence visuelle de composition.
Windows.UI.Composition
API telles que CreateDrawingSurface
toujours spécifier des tailles en unités de pixels. Lorsque vous utilisez Win2D pour dessiner sur une surface de composition, vous pouvez spécifier les ppp que vous souhaitez utiliser lors de l’appel CreateDrawingSession(CompositionDrawingSurface, Rect, Single)
. Tout le dessin effectué par le biais du retour CanvasDrawingSession
sera mis à l’échelle vers le haut ou vers le bas en conséquence.
Guide pratique pour tester la gestion des ppp
Le moyen le plus simple de tester que votre application fera le bon choix en réponse à la modification de l’indicateur DPI d’affichage consiste à s’exécuter sur Windows 10 ou Windows 11 et à modifier les paramètres d’affichage pendant l’exécution de l’application :
- Cliquez avec le bouton droit sur l’arrière-plan du bureau et choisissez « Paramètres d’affichage »
- Déplacez le curseur intitulé « Modifier la taille du texte, des applications et d’autres éléments »
- Cliquez sur le bouton « Appliquer »
- Choisissez « Se déconnecter plus tard »
Si vous n’avez pas Windows 10 ou Windows 11, vous pouvez également tester avec le simulateur Windows. Dans la barre d’outils Visual Studio, remplacez le paramètre « Ordinateur local » par « Simulateur », puis utilisez l’icône De résolution des modifications pour basculer l’affichage simulé entre :
- 100 % (PPP = 96)
- 140 % (PPP = 134,4)
- 180 % (PPP = 172,8)
Windows developer