使用Magick.NET将图像克隆到较大的图像而不调整大小

时间:2016-12-28 11:22:06

标签: c# image imagemagick magicknet

我在讨论\论坛/ StackOverflow /官方文档中搜索了一下,但我找不到有关如何实现我尝试的内容的更多信息。大多数官方文档都涵盖了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)

            }
        }

这是我得到的最大值。为了达到这个目的,我使用了以下帖子:

How to process only one part of image by ImageMagick?

我没有使用GDI +因为我总是使用更大的TIFF文件(大分辨率),并且GDI +倾向于在它可以&#39时抛出异常(参数无效,内存不足) ; t处理所有事情(我加载了三张具有类似分辨率的图像,并且内存不足)。

任何帮助都会很感激,谢谢。 巴勃罗。

2 个答案:

答案 0 :(得分:3)

您可以Composite图片位于具有所需背景的新图片之上,如果具有所需背景,则可以CloneExtent。在@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");
  }
}

答案 1 :(得分: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");                  
            }
        }

希望这有助于某人:)