public ReprojectRowOperation( Registration registration, Image <Rgba32> target, int xOffset, int yOffset, RenderOptions options) { _registration = registration; _target = target; _xOffset = xOffset; _yOffset = yOffset; _options = options; Guard.Against.Null(registration.Image, nameof(registration.Image)); Guard.Against.Null(options.ImageOffset, nameof(options.ImageOffset)); _sourceBuffer = ImageBuffer.ToBuffer(registration.Image); _imageOffset = options.ImageOffset; // Normalise longitude range so it doesn't wrap around the map _longitudeRange = registration.LongitudeRange.UnwrapLongitude(); _latitudeRange = registration.Definition.LatitudeRange; // Calculate end longitude for blend var overlap = BlendRatio * (_longitudeRange.End - _longitudeRange.Start); _blendEndLongitude = _longitudeRange.End + overlap; }
/// <summary> /// Crop to a specified latitude range. /// </summary> private void Crop(Image <Rgba32> underlay, Range latitudeRange) { var yPixelRange = latitudeRange.ToPixelRangeY(underlay.Height); // Crop underlay to target height _logger.LogInformation("Cropping underlay to {min} - {max} px height", yPixelRange.Start, yPixelRange.End); underlay.Mutate(c => c.Crop(new Rectangle(0, yPixelRange.Start, underlay.Width, yPixelRange.Range))); }
/// <summary> /// Offsets an equirectangular underlay to start at a specified longitude. /// </summary> private void Offset(Image <Rgba32> underlay, Range longitudeRange) { var xPixelRange = longitudeRange.ToPixelRangeX(underlay.Width); var offset = -xPixelRange.Start; _logger.LogInformation("Offsetting underlay by {pixels} px", offset); underlay.HorizontalOffset(offset); }