2016-12-28 2 views
0

Я немного искал обсуждения/форумы/StackOverflow/Официальная документация, но я не мог найти много информации о том, как добиться того, что я пытаюсь , Большая часть официальной документации охватывает версию ImageMagick из командной строки.Клонировать изображение для большего размера без изменения размера с помощью Magick.NET

Я опишу, что я пытаюсь сделать: У меня загружено изображение, которое я хотел бы вставить в более крупный. Пример: изображение, которое я загрузил, имеет ширину 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) 

      } 
     } 

Вот максимальный я получил. Для достижения этой цели я использовал следующее сообщение:

How to process only one part of image by ImageMagick?

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

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

ответ

0

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

Вот код:

 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");     
      } 
     } 

Надеется, что это помогает кто-то :)

3

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

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"); 
    } 
} 
Смежные вопросы