Share via


Xamarin.iOS'ta Geniş Renk

Bu makale geniş rengi ve Xamarin.iOS veya Xamarin.Mac uygulamasında nasıl kullanılabileceğini kapsar.

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ıklı piksel biçimleri ve geniş gamut renk alanları desteğini geliştirir. Geniş renkli ekranlara sahip cihazlar için destek, grafik yığınının tamamında bu davranışı sağlayarak daha da kolaylaştırılır.

Varlık Katalogları

Varlık Katalogları ile Geniş Rengi Destekleme

iOS 10 ve macOS Sierra'da Apple, geniş rengi destekleyecek şekilde uygulamanın paketine statik görüntü içeriği eklemek ve kategorilere ayırmak için kullanılan Varlık Kataloglarını genişletti.

Varlık Kataloglarını kullanmak bir uygulamaya aşağıdaki avantajları sağlar:

  • Statik görüntü varlıkları için en iyi dağıtım seçeneğini sağlar.
  • Otomatik renk düzeltmeyi destekler.
  • Otomatik piksel biçimi iyileştirmeyi destekler.
  • Yalnızca ilgili içeriğin son kullanıcının cihazına teslim edilmesini sağlayan Uygulama Dilimleme ve Uygulama İnceltme desteği sağlar.

Apple, geniş renk desteği için Varlık Kataloglarında aşağıdaki geliştirmeleri yapmıştır:

  • 16 bit (renk kanalı başına) kaynak içeriğini destekler.
  • İçerikleri görüntü gamutuna göre kataloglama desteği sağlar. İçerik sRGB veya Görüntü P3 gamutları için etiketlenebilir.

Geliştiricinin uygulamalarında geniş renk içeriğini desteklemek için üç seçeneği vardır:

  1. Hiçbir Şey Yapma - Geniş renkli içerik yalnızca uygulamanın canlı renkler görüntülemesi gereken durumlarda (kullanıcının deneyimini geliştirecekleri) kullanıldığından, 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. Mevcut İçeriği P3 Görüntülenecek Şekilde Yükseltme - Bu, geliştiricinin Varlık Kataloğu'ndaki mevcut görüntü içeriğini P3 biçiminde yeni, yükseltilmiş bir dosyayla değiştirmesini ve Varlık Düzenleyicisi'nde bu şekilde etiketlemesini gerektirir. Derleme zamanında bu varlıklardan sRGB türevi bir görüntü oluşturulur.
  3. İyileştirilmiş Varlık İçeriği Sağlama - Bu durumda geliştirici, Varlık Kataloğu'ndaki her görüntü için hem 8 bit sRGB hem de 16 bit Ekran P3 görüntüsü sağlar (varlık düzenleyicisinde düzgün şekilde etiketlenir).

Varlık Kataloğu Dağıtımı

Geliştirici geniş renkli görüntü içeriği içeren Varlık Katalogları ile App Store'a bir uygulama gönderdiğinde aşağıdakiler gerçekleşir:

  • Uygulama son kullanıcıya dağıtıldığında, Uygulama Dilimleme yalnızca uygun içerik çeşidinin kullanıcının cihazına teslim edilmesini sağlar.
  • Geniş rengi desteklemeyen cihazda, geniş renk içeriğini dahil etmek için yük maliyeti yoktur çünkü cihaza hiçbir zaman gönderilmez.
  • NSImage macOS Sierra 'da (ve üzeri), donanımın ekranı için en iyi içerik gösterimini otomatik olarak seçer.
  • Görüntülenen içerik, cihaz donanımı görüntü özellikleri değiştiğinde veya değiştiğinde otomatik olarak yenilenir.

Varlık Kataloğu Depolama

Varlık Kataloğu depolama alanı, 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ı iyileştirmeye çalışır.
  • Geniş renk içeriği için renk kanalı başına 16 bit kullanılır.
  • İçeriğe bağımlı görüntü sıkıştırma, teslim edilebilir içerik boyutlarını düşürmek için kullanılır. İçerik boyutlarını daha da iyileştirmek için yeni "kayıplı" sıkıştırmalar eklendi.

Uygulamada Ekran Dışı Görüntüleri İşleme

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

Bu iki durumda da uygulama, hem iOS hem de macOS'a eklenen gelişmiş özellikleri kullanarak gerekli görüntüleri geniş renkte ekran dışında işleyebilir.

iOS'ta Geniş Renk Çizme

iOS 10'da geniş renkli bir görüntüyü doğru şekilde çizmeyi tartışmadan önce aşağıdaki yaygın 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 görüntü çizmek için kullanılabilmesi için önce çözülmesi gereken sorunlar vardır. UIGraphics.BeginImageContext (size) iOS 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 fazla görüntü bağlamı oluşturamaz.
  • Genişletilmiş Aralık sRGB Renk Alanı'ndaki renkleri temsil edemez.
  • Alt düzey C yordamları arka planda çağrıldığından, sRGB olmayan bir Renk Alanında bağlam oluşturmak için bir arabirim sağlama özelliğine sahip değildir.

Bu sınırlamaları işlemek ve iOS 10'da geniş renkli bir görüntü çizmek için 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ık sRGB Renk Alanını işleyebilen yeni bir görüntü bağlamı oluşturur ve aşağıdaki özelliklere sahiptir:

  • Varsayılan olarak tamamen renkle 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ık sRGB Renk Alanı'nda işlenip işleneceğine akıllıca karar verir.
  • Geliştiricinin başlangıç ve bitiş bağlamı komutlarını çağırma konusunda endişelenmemesi için görüntü bağlamı (CGContext) ömrünü tamamen ve otomatik olarak yönetir.
  • yöntemiyle UIGraphics.GetCurrentContext() uyumludur.

CreateImage Sınıfın UIGraphicsImageRenderer yöntemi, geniş renkli bir görüntü oluşturmak için çağrılır ve içine çizilecek görüntü bağlamı ile bir tamamlama işleyicisi geçirilir. Çizimin tamamı bu tamamlama işleyicisinin içinde aşağıdaki gibi yapılır:

  • yöntemi geniş UIColor.FromDisplayP3 gamut Display 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 tam doygunlukta kırmızı renkte çizilir.

macOS'ta Geniş Renk Çizme

sınıfı NSImage , Geniş Renkli görüntülerin çizimini desteklemek için macOS Sierra'da genişletilmiştir. Örneğin:

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 İşleme

Geniş renkli görüntüleri ekranda işlemek için, işlem yukarıda sunulan macOS ve iOS için ekran dışı geniş renkli bir resim çizmeye benzer şekilde çalışır.

iOS'ta Ekranda İşleme

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

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

iOS 10'un yukarıda gösterilen sınıfla UIGraphicsImageRenderer yaptığı gibi, yöntem çağrıldığında Draw uygulamanın üzerinde çalıştığı iOS cihazının özelliklerine göre sRGB veya Genişletilmiş Aralık sRGB Renk Alanı'nda işlenip işleneceğine akıllıca karar verir. Buna ek olarak, UIImageView iOS 9.3'ten bu yana renkle de yönetilmektedir.

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

  • P3
  • Srgb
  • Belirtilme -miş

Uygulama, resim çizmek için hangi Renk Alanı'nın kullanıldığını denetlemek istiyorsa, istenen Renk Alanını belirtmek için öğesinin CALayer yeni ContentsFormat bir özelliğini kullanabilir. Bu değer aşağıdakilerin bir CAContentsFormat sabit listesi olabilir:

  • Gray8Uint
  • Rgba16Float
  • Rgba8Uint

macOS'ta Ekranda İşleme

Uygulamanın macOS'ta ekranda geniş renkli bir görüntü işlemesi gerektiğinde, söz konusu yöntemi NSView her zamanki gibi geçersiz kılınDrawRect. Örneğin:

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, yöntem çağrıldığında DrawRect uygulamanın üzerinde çalıştığı Mac donanımının özelliklerine göre sRGB veya Genişletilmiş Aralık sRGB Renk Alanı'nda işlenip işleneceğine akıllıca karar verir.

Uygulama, bir resim çizmek için hangi Renk Alanı'nın kullanıldığını denetlemek istiyorsa, istenen Renk Alanını belirtmek için sınıfın NSWindow yeni DepthLimit bir özelliğini kullanabilir. Bu değer aşağıdakilerin bir NSWindowDepth sabit listesi olabilir:

  • OneHundredTwentyEightBitRgb
  • SixtyfourBitRgb
  • TwentyfourBitRgb