Клонировать изображение в большее без изменения размера с помощью Magick.NET

Я немного обыскал дискуссии \ форумы /Stackru/ Официальную документацию, но не смог найти много информации о том, как добиться того, что я пытаюсь. Большая часть официальной документации охватывает версию ImageMagick для командной строки.

Я опишу, что я пытаюсь сделать: у меня загружено изображение, которое я хотел бы вставить в увеличенное изображение. Пример: загруженное изображение имеет ширину 9920 и высоту 7085. Я хотел бы разместить его посередине большего (ширина 10594, высота 7387). У меня все расчеты границ готовы ([большая ширина - оригинальная ширина / 2], то же самое относится и к высоте).

Но я не знаю, как это сделать с помощью MagickImage. Вот максимум, что я получил:

private void drawInkzone(MagickImage loadedImage, List<string>inkzoneAreaInformation, string filePath)
    {
        unitConversion converter = new unitConversion();
        List<double> inkZoneInfo = inkZoneListFill(inkzoneAreaInformation);
        float DPI = getImageDPI(filePath);
        double zoneAreaWidth_Pixels = converter.mmToPixel(inkZoneInfo.ElementAt(4), DPI);
        double zoneAreaHeight_Pixels = converter.mmToPixel(inkZoneInfo.ElementAt(5), DPI);
        using (MagickImage image = new MagickImage(MagickColor.FromRgb(255, 255, 255), Convert.ToInt32(zoneAreaWidth_Pixels), Convert.ToInt32(zoneAreaHeight_Pixels)))
        {
            //first: defining the larger image, with a white background (must be transparent, but for now its okay)
            using (MagickImage original = loadedImage.Clone())
            {
                //Cloned the original image (already passed as parameter)

            }
        }

Вот максимум, что я получил. Чтобы добиться этого, я использовал следующий пост:

Как обрабатывать ImageMagick только одну часть изображения?

И я не использую GDI+, потому что я всегда буду работать с большими файлами TIFF (большие разрешения), а GDI+ имеет тенденцию генерировать исключения (параметр недействителен, не хватает памяти), когда он не может обработать все (я загрузил три изображения с таким разрешением и вышло из памяти).

Любая помощь будет любезно оценен, спасибо. Пабло.

2 ответа

Вы могли бы либо Composite изображение поверх нового изображения с требуемым фоном или вы могли Clone а также Extent если с необходимым фоном. В ответе @Pablo Costa есть пример для Compositing изображения, так что вот пример того, как вы могли бы расширить изображение:

private void drawInkzone(MagickImage loadedImage, List<string> inkzoneAreaInformation, string filePath)
{
  unitConversion converter = new unitConversion();
  List<double> inkZoneInfo = inkZoneListFill(inkzoneAreaInformation);
  float DPI = getImageDPI(filePath);
  double zoneAreaWidth_Pixels = converter.mmToPixel(inkZoneInfo.ElementAt(4), DPI);
  double zoneAreaHeight_Pixels = converter.mmToPixel(inkZoneInfo.ElementAt(5), DPI);
  using (MagickImage image = loadedImage.Clone())
  {
    MagickColor background = MagickColors.Black;
    int width = (int)zoneAreaWidth_Pixels;
    int height = (int)zoneAreaHeight_Pixels;
    image.Extent(width, height, Gravity.Center, background);
    image.Write(@"C:\DI_PLOT\whatever.png");
  }
}

Мне удалось сделать то, что мне было нужно. Круто, что мне не нужно было рассчитывать границы.

Вот код:

       private void drawInkzone(MagickImage loadedImage, List<string>inkzoneAreaInformation, string filePath)
    {
        unitConversion converter = new unitConversion();
        List<double> inkZoneInfo = inkZoneListFill(inkzoneAreaInformation); //Larger image information
        float DPI = getImageDPI(filePath);
        double zoneAreaWidth_Pixels = converter.mmToPixel(inkZoneInfo.ElementAt(4), DPI); //Width and height for the larger image are in mm , converted them to pixel
        double zoneAreaHeight_Pixels = converter.mmToPixel(inkZoneInfo.ElementAt(5), DPI);//Formula (is: mm * imageDPI) / 25.4
        using (MagickImage image = new MagickImage(MagickColor.FromRgb(0, 0, 0), Convert.ToInt32(zoneAreaWidth_Pixels), Convert.ToInt32(zoneAreaHeight_Pixels)))
        {
            //first: defining the larger image, with a white background (must be transparent, but for now its okay)
            using (MagickImage original = loadedImage.Clone())
            {
                //Cloned the original image (already passed as parameter)
                image.Composite(loadedImage, Gravity.Center);
                image.Write(@"C:\DI_PLOT\whatever.png");                  
            }
        }

Надеюсь, это поможет кому-то:)

Другие вопросы по тегам