private static ProcessImageResult processImage(WicDecoder dec, WicProcessingContext ctx, Stream ostm) { var frm = new WicFrameReader(ctx); WicTransforms.AddMetadataReader(ctx); ctx.FinalizeSettings(); WicTransforms.AddNativeScaler(ctx); WicTransforms.AddExifRotator(ctx); WicTransforms.AddConditionalCache(ctx); WicTransforms.AddCropper(ctx); WicTransforms.AddPixelFormatConverter(ctx); WicTransforms.AddScaler(ctx); WicTransforms.AddColorspaceConverter(ctx); MagicTransforms.AddMatte(ctx); MagicTransforms.AddPad(ctx); WicTransforms.AddIndexedColorConverter(ctx); var enc = new WicEncoder(ctx, ostm.AsIStream()); enc.WriteSource(ctx); return(new ProcessImageResult { Settings = ctx.UsedSettings, Stats = ctx.Stats }); }
private static ProcessImageResult processImage(PipelineContext ctx, Stream ostm) { var frame = (WicImageFrame)ctx.ImageContainer.GetFrame(ctx.Settings.FrameIndex); ctx.AddFrameDisposer(); ctx.ImageFrame = frame; ctx.Source = frame.Source; MagicTransforms.AddGifFrameBuffer(ctx); ctx.FinalizeSettings(); WicTransforms.AddColorProfileReader(ctx); WicTransforms.AddNativeScaler(ctx); WicTransforms.AddExifFlipRotator(ctx); WicTransforms.AddCropper(ctx); WicTransforms.AddPixelFormatConverter(ctx); WicTransforms.AddHybridScaler(ctx); WicTransforms.AddScaler(ctx); WicTransforms.AddColorspaceConverter(ctx); MagicTransforms.AddMatte(ctx); MagicTransforms.AddPad(ctx); WicTransforms.AddIndexedColorConverter(ctx); using var enc = new WicImageEncoder(ctx.Settings.SaveFormat, ostm); using var frm = new WicImageEncoderFrame(ctx, enc); frm.WriteSource(ctx); enc.Commit(); return(new ProcessImageResult(ctx.UsedSettings, ctx.Stats)); }
public static void AddColorspaceConverter(WicProcessingContext ctx) { if (ctx.SourceColorProfile == ctx.DestColorProfile) { if ((ctx.SourceColorProfile == ColorProfile.sRGB || ctx.SourceColorProfile == ColorProfile.sGrey) && ctx.SourceColorContext != null) { AddExternalFormatConverter(ctx); WicTransforms.AddColorspaceConverter(ctx); } return; } if (ctx.Source.Format.NumericRepresentation == PixelNumericRepresentation.Float && ctx.Source.Format.Colorspace != PixelColorspace.LinearRgb) { AddExternalFormatConverter(ctx); } AddInternalFormatConverter(ctx, forceLinear: true); if (ctx.Source.Format.ColorRepresentation != PixelColorRepresentation.Bgr) { return; } var matrix = ctx.SourceColorProfile.Matrix * ctx.DestColorProfile.InverseMatrix; if (matrix == default || matrix.IsIdentity) { return; } ctx.Source = new ColorMatrixTransformInternal(ctx.Source, matrix); }
private static void buildPipeline(WicProcessingContext ctx, bool outputPlanar = true) { var frm = new WicFrameReader(ctx, EnablePlanarPipeline); WicTransforms.AddMetadataReader(ctx); ctx.FinalizeSettings(); ctx.Settings.UnsharpMask = ctx.UsedSettings.UnsharpMask; ctx.Settings.JpegQuality = ctx.UsedSettings.JpegQuality; ctx.Settings.JpegSubsampleMode = ctx.UsedSettings.JpegSubsampleMode; if (ctx.DecoderFrame.SupportsPlanarPipeline) { bool savePlanar = outputPlanar && ctx.Settings.SaveFormat == FileFormat.Jpeg && ctx.SourceColorContext == null; WicTransforms.AddExifRotator(ctx); WicTransforms.AddPlanarCache(ctx); MagicTransforms.AddInternalFormatConverter(ctx); MagicTransforms.AddHighQualityScaler(ctx); MagicTransforms.AddUnsharpMask(ctx); MagicTransforms.AddExternalFormatConverter(ctx); ctx.SwitchPlanarSource(WicPlane.Chroma); if (savePlanar) { var subsample = ctx.Settings.JpegSubsampleMode; if (subsample == ChromaSubsampleMode.Subsample420) { ctx.Settings.Height = (int)Math.Ceiling(ctx.Settings.Height / 2d); } if (subsample == ChromaSubsampleMode.Subsample420 || subsample == ChromaSubsampleMode.Subsample422) { ctx.Settings.Width = (int)Math.Ceiling(ctx.Settings.Width / 2d); } } MagicTransforms.AddInternalFormatConverter(ctx); MagicTransforms.AddHighQualityScaler(ctx); MagicTransforms.AddExternalFormatConverter(ctx); ctx.SwitchPlanarSource(WicPlane.Luma); if (!savePlanar) { WicTransforms.AddPlanarConverter(ctx); WicTransforms.AddColorspaceConverter(ctx); } } else { WicTransforms.AddNativeScaler(ctx); WicTransforms.AddExifRotator(ctx); WicTransforms.AddConditionalCache(ctx); WicTransforms.AddCropper(ctx); WicTransforms.AddPixelFormatConverter(ctx); WicTransforms.AddScaler(ctx, true); MagicTransforms.AddInternalFormatConverter(ctx); MagicTransforms.AddHighQualityScaler(ctx); MagicTransforms.AddMatte(ctx); MagicTransforms.AddUnsharpMask(ctx); MagicTransforms.AddExternalFormatConverter(ctx); WicTransforms.AddColorspaceConverter(ctx); } }