SkiaSharp сохранить изображение с профилем ICC - PullRequest
0 голосов
/ 17 мая 2018

В SkiaSharp, когда вы создаете новое изображение из существующего изображения (например, например, при изменении размера), как вы можете сохранить новое изображение с профилем ICC из исходного изображения?

1 Ответ

0 голосов
/ 19 мая 2018

Таким образом, ответ таков: Skia автоматически применяет профиль ICC , если ColorSpace установлен и поддерживается между исходным и конечным изображениями .

ColorSpace должен быть установлен на исходном объекте И целевом объекте (SKBitmap, SKImage, SKSurface и т. Д.). Это так, чтобы Skia могла знать, как преобразовать цвета между источником и местом назначения , Если ColorSpace не установлен ни на одном из них, или если либо ColorSpace потеряно по пути (что легко случается при создании новых объектов), Skia будет использовать настройки по умолчанию, которые могут искажать преобразование цвета.

Пример правильного способа поддержки ColorSpace:

using (SKData origData = SKData.Create(imgStream)) // convert the stream into SKData
using (SKImage srcImg = SKImage.FromEncodedData(origData))
    // srcImg now contains the original ColorSpace (e.g. CMYK)
{
    SKImageInfo info = new SKImageInfo(resizeWidth, resizeHeight,
        SKImageInfo.PlatformColorType, SKAlphaType.Premul, SKColorSpace.CreateSrgb());
    // this is the important part. set the destination ColorSpace as
    // `SKColorSpace.CreateSrgb()`. Skia will then be able to automatically convert
    // the original CMYK colorspace, to this new sRGB colorspace.

    using (SKImage newImg = SKImage.Create(info)) // new image. ColorSpace set via `info`
    {
        srcImg.ScalePixels(newImg.PeekPixels(), SKFilterQuality.None);
        // now when doing this resize, Skia knows the original ColorSpace, and the
        // destination ColorSpace, and converts the colors from CMYK to sRGB.
    }
}

Еще один пример поддержки ColorSpace:

using (SKCodec codec = SKCodec.Create(imgStream)) // create a codec with the imgStream
{
    SKImageInfo info = new SKImageInfo(codec.Info.Width, codec.Info.Height,
        SKImageInfo.PlatformColorType, SKAlphaType.Premul, SKColorSpace.CreateSrgb());
    // set the destination ColorSpace via SKColorSpace.CreateSrgb()

    SKBitmap srcImg = SKBitmap.Decode(codec, info);
    // Skia creates a new bitmap, converting the codec ColorSpace (e.g. CMYK) to the
    // destination ColorSpace (sRGB)
}

Дополнительная, очень полезная информация о коррекции цвета Skia: https://skia.org/user/sample/color

...