Xamarin. iOS içinde geniş renk

Bu makalede, geniş renkler ve bunun bir Xamarin. iOS veya Xamarin. Mac uygulamasında nasıl kullanılabileceği ele alınmaktadır.

iOS 10 ve macOS Sierra, çekirdek grafikler, çekirdek görüntü, metal ve AVFoundation gibi çerçeveler dahil olmak üzere sistem genelinde genişletilmiş aralıktaki piksel biçimleri ve geniş gamut renk alanları desteğini geliştirir. Geniş renkli ekranları olan cihazlar için destek, tüm grafik yığınının tamamında bu davranışı sunarak daha fazla yapılır.

Varlık katalogları

Varlık kataloglarıyla geniş renk destekleme

İOS 10 ve macOS Sierra 'da, Apple, geniş bir rengi desteklemek için uygulamanın paketindeki statik görüntü içeriğini dahil etmek ve kategorilere ayırmak için kullanılan varlık kataloglarını genişletmiştir.

Varlık kataloglarının kullanılması, bir uygulamaya aşağıdaki avantajları sağlar:

  • Bunlar, statik görüntü varlıkları için en iyi dağıtım seçeneğini sağlar.
  • Otomatik renk düzeltmesini destekler.
  • Otomatik piksel biçimlendirme iyileştirmesini destekler.
  • Bunlar, yalnızca ilgili içeriğin son kullanıcı cihazına teslim edilmesini sağlayan uygulama dilimlenmesini ve uygulama Ölçülü bir uygulamadır.

Apple, geniş renk desteği için varlık kataloglarında aşağıdaki geliştirmeleri yaptı:

  • 16 bit (renk kanalı başına) kaynak içeriğini destekler.
  • Bu, içeriği bir ekran gamutuna göre kataloglarken destekler. İçerik, sRGB veya görüntü P3 GaMaLaR için etiketlenebilir.

Geliştirici, uygulamalarında geniş renk içeriğini desteklemek için üç seçeneğe sahiptir:

  1. Hiçbir şey yapmayın ; geniş renk içeriği yalnızca uygulamanın canlı renkleri görüntülemesi gereken durumlarda (kullanıcının deneyimini geliştirdiklerinde) kullanılması gerektiğinden, bu gereksinimin dışındaki içerikler olduğu gibi bırakılmalıdır. Tüm donanım durumlarında doğru şekilde işlenmeye devam edecektir.
  2. Var olan Içeriği P3 görüntülenecek şekilde Yükselt -bu, geliştiricinin varlık kataloğundaki mevcut görüntü içeriğini P3 biçimindeki yeni, yükseltilen bir dosyayla değiştirmesini ve varlık Düzenleyicisi 'nde olduğu gibi etiketlamalarını gerektirir. Derleme zamanında, bu varlıklardan bir sRGB türevi görüntü oluşturulacaktır.
  3. En Iyi duruma getirilmiş varlık Içeriği sağlama -bu durumda, geliştirici varlık kataloğundaki her bir görüntünün (varlık Düzenleyicisi 'nde düzgün şekilde etiketlendi) hem 8 bit sRGB hem de 16 bitlik bir görüntü P3 vizyonu sağlar.

Varlık kataloğu dağıtımı

Geliştirici, geniş renkli görüntü içeriği içeren varlık kataloglarıyla App Store 'a bir uygulama gönderdiğinde aşağıdakiler olur:

  • Uygulama son kullanıcıya dağıtıldığında, uygulama Dilimleme kullanıcının cihazına yalnızca ilgili içerik çeşidinin teslim edilmesini sağlar.
  • Geniş renk desteğine sahip olmayan cihazda, cihaza hiçbir şekilde gönderilmeyeceğinden geniş renk içeriği eklemek için bir yük maliyeti yoktur.
  • NSImage macOS Sierra (ve üzeri), donanım ekranı için en iyi içerik gösterimini otomatik olarak seçer.
  • Görüntülenen içerik, cihazların donanım görüntüleme özellikleri değiştiğinde otomatik olarak yenilenir.

varlık kataloğu Depolama

Varlık kataloğu depolaması, bir uygulama için aşağıdaki özelliklere ve etkilere sahiptir:

  • Derleme zamanında, Apple, yüksek kaliteli görüntü dönüştürmeleri aracılığıyla görüntü içeriğinin depolanmasını en iyi hale getirmeye çalışır.
  • 16 bit, geniş renk içeriği için renk kanalı başına kullanılır.
  • İçerik bağımlı görüntü sıkıştırması, teslim edilebilir içerik boyutlarını düşürmek için kullanılır. İçerik boyutlarını daha iyi iyileştirmek için yeni "kayıplı" sıkıştırmaları eklenmiştir.

Uygulamada Off-Screen görüntülerini işleme

Oluşturulan uygulama türüne bağlı olarak, kullanıcının internet 'ten toplanan görüntü içeriğini eklemesine veya doğrudan uygulamanın içinde (örneğin bir vektör çizim uygulaması gibi) görüntü içeriği oluşturmasına izin verebilir.

Bu iki durumda da, uygulama, hem iOS hem de macOS 'a eklenen gelişmiş özellikleri kullanarak gerekli görüntü kullanımını geniş bir renkte işleyebilir.

İOS 'ta geniş renk çizme

İOS 10 ' da bir geniş renk görüntüsünü doğru bir şekilde çizmeyi tartışmadan önce, aşağıdaki ortak iOS çizim koduna göz atın:

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

    ...

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

Standart kodda, geniş renkli bir resim çizmek için kullanılmadan önce ele almanız gereken sorunlar vardır. UIGraphics.BeginImageContext (size)İOS görüntü çizimini başlatmak için kullanılan yöntem aşağıdaki sınırlamalara sahiptir:

  • Renk kanalı başına 8 bitten daha fazla görüntü bağlamı oluşturamaz.
  • Genişletilmiş aralıktaki sRGB renk alanındaki renkleri temsil edemez.
  • Arka planda çağrılan alt düzey C yordamları nedeniyle, sRGB olmayan bir renk alanında bağlam oluşturmak için bir arabirim sağlayabilme olanağı yoktur.

Bu sınırlamaları işlemek ve iOS 10 ' da geniş bir renk görüntüsü çizmek için, bunun yerine aşağıdaki kodu kullanın:

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

Yeni UIGraphicsImageRenderer sınıf, genişletilmiş aralıktaki sRGB renk alanını işleyebilen yeni bir görüntü bağlamı oluşturur ve aşağıdaki özelliklere sahiptir:

  • Varsayılan olarak tam renk olarak yönetilir.
  • Varsayılan olarak, genişletilmiş Aralık sRGB renk alanını destekler.
  • Uygulamanın üzerinde çalıştığı iOS cihazının özelliklerine göre sRGB veya genişletilmiş aralıktaki sRGB renk alanında işlenip işlenmeyeceğini belirler.
  • CGContextGeliştirici, BEGIN ve End bağlam komutlarının çağrılması konusunda endişelenmek zorunda kalmaması için görüntü bağlamı () ömrünü tamamen ve otomatik olarak yönetir.
  • UIGraphics.GetCurrentContext()Yöntemiyle uyumludur.

CreateImageSınıfının yöntemi, UIGraphicsImageRenderer geniş bir renk görüntüsü oluşturmak için çağrılır ve çizim için görüntü bağlamı ile bir tamamlama işleyicisi geçirdi. Tüm çizim, bu tamamlama işleyicisinin içinde şu şekilde yapılır:

  • UIColor.FromDisplayP3Yöntemi geniş gamut görüntü P3 renk alanında yeni bir tamamen doygun kırmızı renk oluşturur ve dikdörtgenin ilk yarısını çizmek için kullanılır.
  • Dikdörtgenin ikinci yarısı, karşılaştırma için normal sRGB tamamen doygun kırmızı renkte çizilir.

MacOS 'ta geniş renk çizme

NSImageSınıf, geniş renkli görüntülerin çizimini desteklemek için MacOS Sierra ' de genişletilir. Örnek:

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

Uygulamada ekran görüntülerini işleme

Geniş renk görüntülerini ekranda işlemek için, bu işlem yukarıda sunulan macOS ve iOS için bir ekran genelindeki geniş renkli görüntü çizme gibi çalışarak işe yarar.

İOS 'ta ekran üzerinde işleme

Uygulamanın iOS 'daki geniş renkli ekranda bir görüntüyü işlemesi gerektiğinde, DrawUIView söz konusu yöntemin yöntemini her zamanki gibi geçersiz kılın. Örnek:

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

İOS 10 UIGraphicsImageRenderer ' u yukarıda gösterilen sınıfla yaptığı gibi,, yöntemi çağrıldığında uygulamanın üzerinde çalıştığı iOS cihazının özelliklerine göre sRGB veya genişletilmiş aralıktaki sRGB renk alanında işlenip işlenmeyeceğini belirler Draw . Ayrıca, UIImageView iOS 9,3 sonrasında renk de yönetilmiştir.

Uygulamanın bir veya üzerinde işlemenin nasıl yapıldığını bilmeleri gerekiyorsa UIViewUIViewController , DisplayGamut sınıfının yeni özelliğini denetleyebilir UITraitCollection . Bu değer UIDisplayGamut , aşağıdakilerin bir numaralandırması olacaktır:

  • P3
  • SRGB
  • Belirtilmemiş

Uygulama, görüntü çizmek için hangi renk alanının kullanıldığını denetlemek isterse, ContentsFormatCALayer Istenen renk alanını belirtmek için yeni bir özelliğini kullanabilir. Bu değer CAContentsFormat , aşağıdakilerin bir numaralandırması olabilir:

  • Gray8Uint
  • Rgba16Float
  • Rgba8Uint

MacOS 'ta ekran üzerinde işleme

Uygulamanın macOS 'ta ekran üzerinde geniş renkli bir görüntüyü işlemesi gerektiğinde, DrawRectNSView söz konusu sorunun her zamanki gibi yöntemini geçersiz kılın. Örnek:

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

Yine de, yöntemi çağrıldığında uygulamanın üzerinde çalıştığı Mac donanımının özelliklerine göre sRGB veya genişletilmiş aralıktaki sRGB renk alanında işlenip işlenmeyeceğini belirler DrawRect .

Uygulama, görüntü çizmek için hangi renk alanının kullanıldığını denetlemek isterse, DepthLimitNSWindow Istenen renk alanını belirtmek için sınıfın yeni bir özelliğini kullanabilir. Bu değer NSWindowDepth , aşağıdakilerin bir numaralandırması olabilir:

  • Oneyüz Twentyeightbitrgb
  • Alttyonbitrgb
  • TwentyfourBitRgb