Couleur large dans Xamarin.iOS
Cet article décrit les couleurs larges et la façon dont elles peuvent être utilisées dans une application Xamarin.iOS ou Xamarin.Mac.
iOS 10 et macOS Sierra améliore la prise en charge des formats de pixels à plage étendue et des espaces de couleurs à large gamme dans tout le système, y compris les frameworks tels que Core Graphics, Core Image, Metal et AVFoundation. La prise en charge des appareils avec des affichages couleur larges est encore facilitée en fournissant ce comportement dans l’ensemble de la pile graphique.
Catalogues de ressources
Prise en charge des couleurs larges avec les catalogues de ressources
Dans iOS 10 et macOS Sierra, Apple a développé les catalogues de ressources utilisés pour inclure et catégoriser le contenu d’images statiques dans l’offre groupée de l’application afin de prendre en charge les couleurs larges.
L’utilisation de catalogues de ressources offre les avantages suivants à une application :
- Ils fournissent la meilleure option de déploiement pour les ressources d’image statiques.
- Ils prennent en charge la correction automatique des couleurs.
- Ils prennent en charge l’optimisation automatique du format de pixels.
- Ils prennent en charge le découpage d’application et l’amincissement des applications, ce qui garantit que seul le contenu pertinent est remis à l’appareil de l’utilisateur final.
Apple a apporté les améliorations suivantes aux catalogues d’actifs pour une prise en charge étendue des couleurs :
- Ils prennent en charge le contenu source 16 bits (par canal couleur).
- Ils prennent en charge le catalogage du contenu par gamut d’affichage. Le contenu peut être marqué pour les gamuts sRGB ou Display P3.
Le développeur dispose de trois options pour prendre en charge le contenu de couleur large dans ses applications :
- Ne rien faire : étant donné que le contenu en couleurs larges ne doit être utilisé que dans les situations où l’application doit afficher des couleurs vives (où elles amélioreront l’expérience de l’utilisateur), le contenu en dehors de cette exigence doit être laissé tel quel. Il continuera d’être rendu correctement dans toutes les situations matérielles.
- Mettre à niveau le contenu existant vers l’affichage P3 : pour cela, le développeur doit remplacer le contenu d’image existant dans son catalogue de ressources par un nouveau fichier mis à niveau au format P3 et l’étiqueter comme tel dans l’éditeur de ressources. Au moment de la génération, une image dérivée sRGB est générée à partir de ces ressources.
- Fournir un contenu de ressource optimisé : dans ce cas, le développeur fournit à la fois une vision SRGB 8 bits et une vision P3 d’affichage 16 bits de chaque image du catalogue de ressources (correctement étiquetée dans l’éditeur de ressources).
Déploiement du catalogue de ressources
Les éléments suivants se produisent lorsque le développeur envoie une application au App Store avec des catalogues de ressources qui incluent le contenu d’images en couleur large :
- Lorsque l’application est déployée sur l’utilisateur final, app Slicing garantit que seule la variante de contenu appropriée est remise à l’appareil de l’utilisateur.
- Sur un appareil qui ne prend pas en charge les couleurs larges, il n’y a aucun coût de charge utile pour l’inclusion de contenu de couleur large, car il n’est jamais expédié à l’appareil.
NSImage
sur macOS Sierra (et versions ultérieures) sélectionne automatiquement la meilleure représentation du contenu pour l’affichage du matériel.- Le contenu affiché est automatiquement actualisé lorsque ou si les caractéristiques d’affichage matérielle des appareils changent.
Stockage du catalogue de ressources
Le stockage du catalogue de ressources a les propriétés et les implications suivantes pour une application :
- Au moment de la génération, Apple tente d’optimiser le stockage du contenu de l’image via des conversions d’images de haute qualité.
- Les 16 bits sont utilisés par canal de couleur pour un contenu de couleur large.
- La compression d’image dépendante du contenu est utilisée pour réduire les tailles de contenu livrables. De nouvelles compressions « avec perte » ont été ajoutées pour optimiser davantage les tailles de contenu.
Rendu Off-Screen images dans l’application
En fonction du type d’application en cours de création, cela peut permettre à l’utilisateur d’inclure le contenu d’image qu’il a collecté à partir d’Internet ou de créer du contenu d’image directement à l’intérieur de l’application (comme une application de dessin vectoriel par exemple).
Dans ces deux cas, l’application peut afficher les images requises hors écran en couleur large à l’aide de fonctionnalités améliorées ajoutées à iOS et macOS.
Dessin d’une couleur large dans iOS
Avant de discuter de la façon de dessiner correctement une image en couleur large dans iOS 10, consultez le code de dessin iOS courant suivant :
public UIImage DrawWideColorImage ()
{
var size = new CGSize (250, 250);
UIGraphics.BeginImageContext (size);
...
UIGraphics.EndImageContext ();
return image = UIGraphics.GetImageFromCurrentImageContext ();
}
Il existe des problèmes liés au code standard qui devront être résolus avant qu’il puisse être utilisé pour dessiner une image en couleur large. La UIGraphics.BeginImageContext (size)
méthode utilisée pour démarrer le dessin d’image iOS présente les limitations suivantes :
- Il ne peut pas créer de contextes d’image avec plus de 8 bits par canal de couleur.
- Il ne peut pas représenter les couleurs dans l’espace de couleurs sRGB de plage étendue.
- Il n’a pas la possibilité de fournir une interface pour créer des contextes dans un espace de couleur non-sRGB en raison des routines C de bas niveau appelées en arrière-plan.
Pour gérer ces limitations et dessiner une image en couleur large dans iOS 10, utilisez plutôt le code suivant :
public UIImage DrawWideColorImage ()
{
var size = new CGSize (250, 250);
var render = new UIGraphicsImageRenderer (size);
var image = render.CreateImage ((UIGraphicsImageRendererContext context) => {
var bounds = context.Format.Bounds;
CGRect slice;
CGRect remainder;
bounds.Divide (bounds.Width / 2, CGRectEdge.MinXEdge, out slice, out remainder);
var redP3 = UIColor.FromDisplayP3 (1.0F, 0.0F, 0.0F, 1.0F);
redP3.SetColor ();
context.FillRect (slice);
var redRGB = UIColor.Red;
redRGB.SetColor ();
context.FillRect (remainder);
});
// Return results
return image;
}
La nouvelle UIGraphicsImageRenderer
classe crée un contexte d’image capable de gérer l’espace coloriaire sRGB de plage étendue et elle dispose des fonctionnalités suivantes :
- Il est entièrement géré par les couleurs par défaut.
- Il prend en charge l’espace de couleur sRGB de plage étendue par défaut.
- Il décide intelligemment s’il doit s’afficher dans l’espace de couleur sRGB ou étendue sRGB en fonction des fonctionnalités de l’appareil iOS sur lequel l’application s’exécute.
- Il gère entièrement et automatiquement la durée de vie du contexte de l’image (
CGContext
) afin que le développeur n’ait pas à se soucier de l’appel des commandes de contexte de début et de fin. - Elle est compatible avec la
UIGraphics.GetCurrentContext()
méthode .
La CreateImage
méthode de la UIGraphicsImageRenderer
classe est appelée pour créer une image couleur large et a passé un gestionnaire d’achèvement avec le contexte d’image dans lequel dessiner. Tout le dessin est effectué à l’intérieur de ce gestionnaire de saisie semi-automatique comme suit :
- La
UIColor.FromDisplayP3
méthode crée une nouvelle couleur rouge entièrement saturée dans l’espace de couleur de l’affichage P3 à large gamut et elle est utilisée pour dessiner la première moitié du rectangle. - La deuxième moitié du rectangle est dessinée dans la couleur rouge saturée sRGB normale à des fins de comparaison.
Dessin d’une couleur large dans macOS
La NSImage
classe a été développée dans macOS Sierra pour prendre en charge le dessin d’images Wide Color. Par exemple :
var size = CGSize(250,250);
var wideColorImage = new NSImage(size, false, (drawRect) =>{
var rects = drawRect.Divide(drawRect.Size.Width/2,CGRect.MinXEdge);
var color = new NSColor(1.0, 0.0, 0.0, 1.0).Set();
var path = new NSBezierPath(rects.Slice).Fill();
color = new NSColor(1.0, 0.0, 0.0, 1.0).Set();
path = new NSBezierPath(rects.Remainder).Fill();
// Return modified
return true;
});
Rendu d’images à l’écran dans l’application
Pour afficher des images en couleurs larges à l’écran, le processus fonctionne de la même façon que le dessin d’une image couleur large hors écran pour macOS et iOS présentée ci-dessus.
Rendu à l’écran dans iOS
Lorsque l’application doit restituer une image en couleur large à l’écran dans iOS, remplacez la Draw
méthode du en question comme d’habitude UIView
. Par exemple :
using System;
using UIKit;
using CoreGraphics;
namespace MonkeyTalk
{
public class MonkeyView : UIView
{
public MonkeyView ()
{
}
public override void Draw (CGRect rect)
{
base.Draw (rect);
// Draw the image to screen
...
}
}
}
Comme iOS 10 le fait avec la UIGraphicsImageRenderer
classe ci-dessus, il décide intelligemment s’il doit s’afficher dans l’espace de couleur sRGB ou plage étendue sRGB en fonction des fonctionnalités de l’appareil iOS sur lequel l’application s’exécute lorsque la Draw
méthode est appelée. En outre, la UIImageView
couleur est également gérée depuis iOS 9.3.
Si l’application doit savoir comment le rendu est effectué sur un UIView
ou UIViewController
, elle peut case activée la nouvelle DisplayGamut
propriété de la UITraitCollection
classe . Cette valeur est une UIDisplayGamut
énumération des éléments suivants :
- P3
- Srgb
- Non spécifié
Si l’application souhaite contrôler l’espace de couleur utilisé pour dessiner une image, elle peut utiliser une nouvelle ContentsFormat
propriété de pour CALayer
spécifier l’espace de couleur souhaité. Cette valeur peut être une CAContentsFormat
énumération des éléments suivants :
- Gray8Uint
- Rgba16Float
- Rgba8Uint
Rendu à l’écran dans macOS
Lorsque l’application doit restituer une image en couleur large à l’écran dans macOS, remplacez la DrawRect
méthode du NSView
en question comme d’habitude. Par exemple :
using System;
using AppKit;
using CoreGraphics;
using CoreAnimation;
namespace MonkeyTalkMac
{
public class MonkeyView : NSView
{
public MonkeyView ()
{
}
public override void DrawRect (CGRect dirtyRect)
{
base.DrawRect (dirtyRect);
// Draw graphics into the view
...
}
}
}
Là encore, il décide intelligemment s’il doit s’afficher dans l’espace coloriaire sRGB ou plage étendue sRGB en fonction des fonctionnalités du matériel Mac sur lequel l’application s’exécute lorsque la DrawRect
méthode est appelée.
Si l’application souhaite contrôler l’espace de couleur utilisé pour dessiner une image, elle peut utiliser une nouvelle DepthLimit
propriété de la NSWindow
classe pour spécifier l’espace coloriaire souhaité. Cette valeur peut être une NSWindowDepth
énumération des éléments suivants :
- OneHundredTwentyEightBitRgb
- SixtyfourBitRgb
- TwentyfourBitRgb