Клонировать изображение в большее без изменения размера с помощью 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");
}
}
Надеюсь, это поможет кому-то:)