我在讨论\论坛/ 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处理所有事情(我加载了三张具有类似分辨率的图像,并且内存不足)。
任何帮助都会很感激,谢谢。 巴勃罗。
答案 0 :(得分: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");
}
}
答案 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");
}
}
希望这有助于某人:)