0

我在讨论\论坛/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)

            }
        }

这是我得到的最大值。为了实现这一点,我使用了以下帖子:

如何通过 ImageMagick 只处理图像的一部分?

而且我没有使用 GDI+,因为我将始终使用更大的 TIFF 文件(大分辨率),并且当 GDI+ 无法处理所有内容(我加载了三个图像)时,它往往会抛出异常(参数无效,内存不足)具有这样的分辨率,并且内存不足)。

任何帮助将不胜感激,谢谢。巴勃罗。

4

2 回答 2

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");
  }
}
于 2016-12-29T06:54:55.563 回答
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");                  
            }
        }

希望这可以帮助某人:)

于 2016-12-28T12:37:49.030 回答