public Block ConvertToBlock(IImage <T> input, IEnumerable <IFitsValue> extraKeys, bool isXtension = false)
        {
            if (input is null)
            {
                throw new ArgumentNullException(nameof(input), SR.NullArgument);
            }

            AllowedTypes.ValidateDataType <T>();

            var extraKeysInst = (extraKeys ?? Enumerable.Empty <IFitsValue>()).ToList();

            // Throws if mandatory keys are present
            Extensions.CheckExtraFitsKeys(extraKeysInst);

            var bitPix = FitsCs.Extensions.ConvertTypeToBitPix <T>()
                         ?? throw new InvalidOperationException(string.Format(SR.TypeNotSupported, typeof(T)));

            var desc = new Descriptor(
                bitPix,
                new[] { input.Width, input.Height },
                isXtension ? ExtensionType.Image : ExtensionType.Primary);

            var keys = new List <IFitsValue>(extraKeysInst.Count + 10);

            keys.AddRange(desc.GenerateFitsHeader());
            keys.AddRange(extraKeysInst);
            keys.Add(FitsKey.CreateEnd());

            var block = Block <T> .CreateWithData(desc, keys, x =>
            {
                input.GetView().CopyTo(x);
            });

            return(block);
        }