Rozsáhlá barva v Xamarin. iOSWide Color in Xamarin.iOS

Tento článek se zabývá nejrůznějšími barvami a jejich použití v aplikaci Xamarin. iOS nebo Xamarin. Mac.This article covers wide color and how it can be used in a Xamarin.iOS or Xamarin.Mac app.

iOS 10 a macOS Sierra vylepšuje podporu formátů pixelů v rozšířeném rozsahu a barevné prostory široké škály v celém systému, včetně platforem, jako je základní grafika, základní obrázek, kov a AVFoundation.iOS 10 and macOS Sierra enhances the support for extended-range pixel formats and wide-gamut color spaces throughout the system including frameworks such as Core Graphics, Core Image, Metal, and AVFoundation. Podpora pro zařízení s celou barvou se zobrazuje dál nesníží tím, že poskytuje toto chování v celém zásobníku grafiky.Support for devices with wide color displays is further eased by providing this behavior throughout the entire graphics stack.

Katalogy assetůAsset Catalogs

Podpora nejrůznějších barev s katalogy prostředkůSupporting Wide Color with Asset Catalogs

V iOS 10 a macOS Sierra rozšířila společnost Apple katalogy assetů používané k zahrnutí a kategorizaci obsahu statického obrazu v sadě prostředků aplikace, aby podporovaly rozsáhlou barvu.In iOS 10 and macOS Sierra, Apple has expanded the Asset Catalogs used to include and categorize static image content in the app's bundle to support wide color.

Použití katalogů assetů přináší aplikacím následující výhody:Using Asset Catalogs provide the following benefits to an app:

  • Poskytují nejlepší možnost nasazení pro prostředky statických imagí.They provide the best deployment option for static image assets.
  • Podporují automatickou korekci barev.They support automatic color correction.
  • Podporují automatickou optimalizaci formátu pixelů.They support automatic pixel format optimization.
  • Podporují průřezy aplikací a zúžení aplikací, které zajistí, že se do zařízení koncového uživatele doručí jenom obsah, který je relevantní.They support App Slicing and App Thinning which ensures that only the content that is relevant get's delivered to the end user's device.

Společnost Apple provedla následující vylepšení katalogů assetů pro rozsáhlou podporu barev:Apple has made the following enhancements to Asset Catalogs for wide color support:

  • Podporují pro zdrojový obsah 16bitový (na jeden barevný kanál).They support 16-bit (per color channel) source content.
  • Podporují katalogování obsahu zobrazením gamutu.They support cataloging content by display gamut. Obsah může být tagovaný buď pro sRGB, nebo pro zobrazení rozsahů P3.Content can be tagged for either the sRGB or Display P3 gamuts.

Vývojář má tři možnosti pro podporu širšího barevného obsahu ve svých aplikacích:The developer has three options for supporting wide color content in their apps:

  1. Nedělat nic – nedoporučuje se použít jenom v situacích, kdy aplikace potřebuje zobrazit ostré barvy (kde budou rozšiřovat uživatelské prostředí). obsah mimo tento požadavek by měl zůstat tak, jak je.Do Nothing - Since wide color content should only be used in situations where the app needs to display vivid colors (where they will enhance the user's experience), content outside of this requirement should be left as-is. Bude i nadále vygenerována správně ve všech situacích hardwaru.It will continue to be rendered correctly in all hardware situations.
  2. Upgradovat existující obsah pro zobrazení P3 – vyžaduje, aby vývojář nahradil stávající obsah obrázku v katalogu assetů novým upgradovaným souborem ve formátu P3 a v editoru prostředků ho označí jako takový.Upgrade Existing Content to Display P3 - This requires the developer to replace the existing image content in their Asset Catalog with a new, upgraded file in the P3 format and tag it as such in the Asset Editor. V době sestavování se z těchto assetů vygeneruje odvozená image sRGB.At build time, a sRGB derivative image will be generated from these assets.
  3. Poskytnutí optimalizovaného obsahu prostředku – v této situaci vývojář nabídne 8-bit sRGB a 16bitový displej pro každý obrázek v katalogu assetů (v editoru assetů je správně označený).Provide Optimized Asset Content - In this situation, the developer will provide both an 8-bit sRGB and a 16-bit Display P3 vision of each image in the Asset Catalog (properly tagged in the asset editor).

Nasazení katalogu assetůAsset Catalog Deployment

K následujícímu dojde, když vývojář odešle aplikaci do App Storu s katalogy assetů, které zahrnují obsah v celé barvě.The following will occur when the developer submits an app to the App Store with Asset Catalogs that include wide color image content:

  • Při nasazení aplikace pro koncového uživatele se v průřezech aplikace zaručí, že zařízení uživatele bude doručovat jenom odpovídající varianta obsahu.When the app is deployed to the end user, App Slicing will ensure that only the appropriate content variant is delivered to the user's device.
  • V zařízeních, které nepodporují rozsáhlou barvu, neexistují žádné náklady na zatížení, které by měly zahrnovat obsah s velkým množstvím barev, protože se do zařízení nikdy nedodává.On device that don't support wide color, there is no payload cost for including wide color content, as it is never shipped to the device.
  • NSImage v macOS Sierra (a novějším) automaticky vybere nejlepší reprezentace obsahu pro zobrazení hardwaru.NSImage on macOS Sierra (and later) will automatically select the best content representation for the hardware's display.
  • Zobrazený obsah se automaticky aktualizuje, když nebo pokud se změní charakteristiky zobrazení hardwaru zařízení.The displayed content will be refreshed automatically when or if the devices hardware display characteristics change.

Úložiště katalogu assetůAsset Catalog Storage

Úložiště katalogu assetů má následující vlastnosti a důsledky pro aplikaci:Asset Catalog storage has the following properties and implications for an app:

  • V době sestavování se Apple pokusí optimalizovat úložiště obsahu obrazu pomocí převodů obrázků s vysokou kvalitou.At build time, Apple attempts to optimize the storage of the image content via high quality image conversions.
  • 16 bitů se používá na barevný kanál pro obsah s velkým množstvím barev.16-bits are used per color channel for wide color content.
  • Komprese image závislá na obsahu se používá pro snížení velikosti obsahu.Content dependent image compression is used to lower deliverable content sizes. K dalším optimalizaci velikosti obsahu se přidaly nové komprese s "ztrátou".New "lossy" compressions have been added to further optimize content sizes.

Vykreslování obrázků mimo obrazovku v aplikaciRendering Off-Screen Images in App

V závislosti na typu vytvářeného aplikace může uživatel zahrnout obsah obrázku, který shromáždil z Internetu, nebo vytvořit obsah obrázku přímo v aplikaci (například jako aplikace pro vektorové kreslení).Based on the type of app being created, it might allow the user to include image content they have collected from the internet or create image content directly inside of the app (like a vector drawing app for example).

V obou těchto případech může aplikace vykreslovat požadované černobílé zobrazení v nejrůznějších barvách pomocí vylepšených funkcí přidaných do iOS i macOS.In both of these cases, the app can render the required imagery off-screen in wide color using enhanced features added to both iOS and macOS.

Vykreslování velkých barev v iOSDrawing Wide Color in iOS

Předtím, než se podíváte na to, jak správně nakreslit rozsáhlou barvu obrázku v iOS 10, se podívejte na následující běžný kód pro kreslení iOS:Before discussing how to correctly draw a wide color image in iOS 10, take a look at the following common iOS drawing code:

public UIImage DrawWideColorImage ()
{
    var size = new CGSize (250, 250);
    UIGraphics.BeginImageContext (size);

    ...

    UIGraphics.EndImageContext ();
    return image = UIGraphics.GetImageFromCurrentImageContext ();
    }

Došlo k potížím se standardním kódem, který bude muset být vyřešen předtím, než bude možné použít k vykreslení obrázku s velkou barvou.There are issues with the standard code that will need to be addressed before it can be used to draw a wide color image. Metoda UIGraphics.BeginImageContext (size) použitá ke spuštění vykreslování obrázku iOS má následující omezení:The UIGraphics.BeginImageContext (size) method used to start iOS image drawing has the following limitations:

  • Nemůže vytvořit kontexty obrázků s více než 8 bity na barevný kanál.It cannot create image contexts with more than 8 bits per color channel.
  • Nemůže reprezentovat barvy v barevném prostoru RGB rozšířeného rozsahu.It cannot represent colors in the Extended Range sRGB Color Space.
  • Není schopen poskytnout rozhraní pro vytvoření kontextů v prostoru, který není sRGB, protože na pozadí jsou volány rutiny nízké úrovně C.It does not have the ability to provide an interface to create contexts in a non-sRGB Color Space because of the low-level C routines being called in the background.

Chcete-li tato omezení zpracovat a nakreslit v systému iOS 10 obrázek s velkým barevným obrázkem, použijte místo toho následující kód:To handle these limitations and draw a wide color image in iOS 10, use the following code instead:

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;
}

Nová třída UIGraphicsImageRenderer vytvoří nový kontext obrázku, který dokáže zpracovat barevný prostor sRGB rozšířeného rozsahu a má následující funkce:The new UIGraphicsImageRenderer class creates a new image context that is capable of handling the Extended Range sRGB Color Space and it has the following features:

  • Ve výchozím nastavení se spravuje plně barevně.It is fully color managed by default.
  • Ve výchozím nastavení podporuje barevný prostor sRGB rozšířeného rozsahu.It supports the Extended Range sRGB Color Space by default.
  • Inteligentním způsobem se určuje, jestli by se měl vykreslovat v barevném prostoru sRGB nebo v rozšířeném rozsahu, na základě schopností zařízení s iOS, na kterém je aplikace spuštěná.It intelligently decides if it should render in the sRGB or Extended Range sRGB Color Space based on the capabilities of the iOS device that the app is running on.
  • Je plně a automaticky spravuje dobu života kontextu Image (CGContext), takže vývojář nemusí dělat obavy o volání příkazů Begin a end kontextu.It fully and automatically manages the image context (CGContext) lifetime so the developer doesn't have to worry about calling begin and end context commands.
  • Je kompatibilní s metodou UIGraphics.GetCurrentContext().It is compatible with the UIGraphics.GetCurrentContext() method.

Metoda CreateImage třídy UIGraphicsImageRenderer je volána, aby vytvořila velký obrázek barvy a vyhověla obslužné rutině dokončení s kontextem obrázku pro vykreslení.The CreateImage method of the UIGraphicsImageRenderer class is called to create a wide color image and passed a completion handler with the image context to draw into. Vše vykreslování je provedeno v rámci této obslužné rutiny dokončení následujícím způsobem:All of the drawing is done inside of this completion handler as follows:

  • Metoda UIColor.FromDisplayP3 vytvoří novou plně barevně nasycenou červenou barvu v šířce vodorovně zobrazit barevný prostor, který se použije k vykreslení první poloviny obdélníku.The UIColor.FromDisplayP3 method creates a new fully saturated red color in the wide gamut Display P3 Color Space and it is used to draw the first half of the rectangle.
  • Druhá polovina obdélníku je vykreslena v normálním barevném formátu sRGB, který je plně nasycený pro porovnání.The second half of the rectangle is drawn in the normal sRGB fully saturated red color for comparison.

Vykreslování velkých barev v macOSDrawing Wide Color in macOS

Třída NSImage se rozšířila v macOS Sierra tak, aby podporovala vykreslování velkých barevných obrázků.The NSImage class has been expanded in macOS Sierra to support the drawing of Wide Color images. Příklad:For example:

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;
});

Vykreslování obrázků na obrazovce v aplikaciRendering On-Screen Images in App

Aby bylo možné vykreslit obrázky na celé obrazovce, proces funguje podobně jako při vykreslování horní obrazovky pro macOS a iOS, které jsou uvedeny výše.To render wide color images on-screen, the process works similar to drawing an off-screen wide color image for macOS and iOS presented above.

Vykreslování na obrazovce v iOSRendering On-Screen in iOS

Když aplikace potřebuje vykreslit obrázek v celé barvě na obrazovce v iOS, přepište metodu Draw UIView, na kterou se jedná normálně.When the app needs to render an image in wide color on-screen in iOS, override the Draw method of the UIView in question as usual. Příklad:For example:

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
        ...
        }
    }
}

Vzhledem k tomu, že iOS 10 má výše uvedenou třídu UIGraphicsImageRenderer, inteligentně se rozhodne, zda se má vykreslovat v barevném prostoru sRGB nebo v rozšířeném rozsahu, na základě schopností zařízení s iOS, na kterém je aplikace spuštěná, když je volána metoda Draw.As iOS 10 does with the UIGraphicsImageRenderer class shown above, it intelligently decides if it should render in the sRGB or Extended Range sRGB Color Space based on the capabilities of the iOS device that the app is running on when the Draw method is called. Kromě toho je UIImageView barevně spravovaná i od verze iOS 9,3.Additionally, the UIImageView has been color managed since iOS 9.3 as well.

Pokud aplikace potřebuje informace o tom, jak se vykreslování provádí na UIView nebo UIViewController, může kontrolovat vlastnost nového DisplayGamut třídy UITraitCollection.If the app needs to know how rendering is being done on a UIView or UIViewController, it can check the new DisplayGamut property of the UITraitCollection class. Tato hodnota bude UIDisplayGamut výčet těchto hodnot:This value will be a UIDisplayGamut enum of the following:

  • P3P3
  • SRGBSrgb
  • NeurčenéUnspecified

Pokud chce aplikace řídit, který barevný prostor se použije k nakreslení obrázku, může použít novou vlastnost ContentsFormat CALayer k určení požadovaného barevného prostoru.If the app wants to control which Color Space is used to draw an image, it can use a new ContentsFormat property of the CALayer to specify the desired Color Space. Tato hodnota může být CAContentsFormat výčtu těchto hodnot:This value can be a CAContentsFormat enum of the following:

  • Gray8UintGray8Uint
  • Rgba16FloatRgba16Float
  • Rgba8UintRgba8Uint

Vykreslování na obrazovce v macOSRendering On-Screen in macOS

Když aplikace potřebuje vykreslit obrázek na obrazovce s velkou barvou v macOS, přepište metodu DrawRect NSView, na kterou se jedná normálně.When the app needs to render an image in wide color on-screen in macOS, override the DrawRect method of the NSView in question as usual. Příklad:For example:

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
            ...
        }
    }
}

Znovu se inteligentním způsobem rozhodne, zda se má vykreslovat v barevném prostoru sRGB nebo v rozšířeném rozsahu, na základě schopností hardwaru Mac, na kterém je aplikace spuštěná, když je volána metoda DrawRect.Again, it intelligently decides if it should render in the sRGB or Extended Range sRGB Color Space based on the capabilities of the Mac hardware that the app is running on when the DrawRect method is called.

Pokud chce aplikace řídit, který barevný prostor se použije k nakreslení obrázku, může použít novou vlastnost DepthLimit třídy NSWindow k určení požadovaného barevného prostoru.If the app wants to control which Color Space is used to draw an image, it can use a new DepthLimit property of the NSWindow class to specify the desired Color Space. Tato hodnota může být NSWindowDepth výčtu těchto hodnot:This value can be a NSWindowDepth enum of the following:

  • OneHundredTwentyEightBitRgbOneHundredTwentyEightBitRgb
  • SixtyfourBitRgbSixtyfourBitRgb
  • TwentyfourBitRgbTwentyfourBitRgb