MagicNET 将 PDF 转换为黑白(1 位)PNG
MagicNET convert PDF to black and white (1bit) PNG
我们的一位客户需要将 PDF 运输标签转换为 PNG 图像。 PDF 图像需要为 300 DPI,位深度为 1(纯黑白无灰度)。
我已经开始工作了,但是有些问题我找不到任何解决方案。
我的代码
MagickNET.SetGhostscriptDirectory(_ghostscriptPath);
var settings = new MagickReadSettings();
settings.Density = new Density(_dpi);
//settings.ColorType = ColorType.Bilevel; // Not working
//settings.Depth = 1; // Not working
//settings.SetDefine(MagickFormat.Png, "Bit-depth", "1"); // Not working
using (var images = new MagickImageCollection())
{
images.Read(sourceFilePath, settings);
using (var horizontal = images.AppendHorizontally())
{
//horizontal.Density = new Density(_dpi); // Not working
horizontal.BitDepth(1); // Testing (Sometimes commented out)
horizontal.Write(targetPath_working);
}
}
结果
当此代码为 运行 且具有以下设置 (BitDepth(1) + 300 DPI) 时,PNG 图像为 1169x2303 和(4 位深度)。
当此代码为 运行 且具有以下设置(已删除 BitDepth(1) + 300 DPI)时,PNG 图像为 1169x2303 和(32 位深度)。
这给了我两个主要问题,当 BitDepth 设置为 1 时,为什么 PNG 图像仍然是 4 位?其次,该 4 位图像的质量非常糟糕,条形码扫描仪无法读取。感觉图像在写入过程中不知何故被调整了大小。我需要具有 32 位图像的“清晰度”,但为 1 位。
有人能给我指出正确的方向吗,感觉我缺乏图像转换的诀窍。
谢谢!
PS:我正在使用 Magick.NET-Q8-AnyCPU (7.23.3)
测试建议1
图像的所有内容都以黑线为边框,none 文本填充为黑色,但图像现在是预期的 1 位。
MagickNET.SetGhostscriptDirectory(_ghostscriptPath);
var settings = new MagickReadSettings();
settings.Density = new Density(_dpi);
settings.SetDefine(MagickFormat.Png, "Bit-depth", "1");
using (var images = new MagickImageCollection())
{
images.Read(sourceFilePath, settings);
using (var horizontal = images.AppendHorizontally())
{
horizontal.AutoLevel();
horizontal.Threshold(new Percentage(50));
horizontal.Write(targetPath_working);
}
}
已找到解决我的问题的方法,请参阅下面的代码。必须结合使用多种不同的设置才能获得良好的最终结果。
MagickNET.SetGhostscriptDirectory(_ghostscriptPath);
var settings = new MagickReadSettings();
settings.Density = new Density(_dpi);
settings.SetDefine(MagickFormat.Png, "Bit-depth", "1");
using (var images = new MagickImageCollection())
{
images.Read(sourceFilePath, settings);
using (var horizontal = images.AppendHorizontally())
{
horizontal.AutoLevel();
horizontal.Threshold(new Percentage(50));
horizontal.ColorType = ColorType.Bilevel;
horizontal.Format = MagickFormat.Png8;
horizontal.Write(targetPath_working);
}
}
我们的一位客户需要将 PDF 运输标签转换为 PNG 图像。 PDF 图像需要为 300 DPI,位深度为 1(纯黑白无灰度)。
我已经开始工作了,但是有些问题我找不到任何解决方案。
我的代码
MagickNET.SetGhostscriptDirectory(_ghostscriptPath);
var settings = new MagickReadSettings();
settings.Density = new Density(_dpi);
//settings.ColorType = ColorType.Bilevel; // Not working
//settings.Depth = 1; // Not working
//settings.SetDefine(MagickFormat.Png, "Bit-depth", "1"); // Not working
using (var images = new MagickImageCollection())
{
images.Read(sourceFilePath, settings);
using (var horizontal = images.AppendHorizontally())
{
//horizontal.Density = new Density(_dpi); // Not working
horizontal.BitDepth(1); // Testing (Sometimes commented out)
horizontal.Write(targetPath_working);
}
}
结果
当此代码为 运行 且具有以下设置 (BitDepth(1) + 300 DPI) 时,PNG 图像为 1169x2303 和(4 位深度)。
当此代码为 运行 且具有以下设置(已删除 BitDepth(1) + 300 DPI)时,PNG 图像为 1169x2303 和(32 位深度)。
这给了我两个主要问题,当 BitDepth 设置为 1 时,为什么 PNG 图像仍然是 4 位?其次,该 4 位图像的质量非常糟糕,条形码扫描仪无法读取。感觉图像在写入过程中不知何故被调整了大小。我需要具有 32 位图像的“清晰度”,但为 1 位。
有人能给我指出正确的方向吗,感觉我缺乏图像转换的诀窍。
谢谢!
PS:我正在使用 Magick.NET-Q8-AnyCPU (7.23.3)
测试建议1
图像的所有内容都以黑线为边框,none 文本填充为黑色,但图像现在是预期的 1 位。
MagickNET.SetGhostscriptDirectory(_ghostscriptPath);
var settings = new MagickReadSettings();
settings.Density = new Density(_dpi);
settings.SetDefine(MagickFormat.Png, "Bit-depth", "1");
using (var images = new MagickImageCollection())
{
images.Read(sourceFilePath, settings);
using (var horizontal = images.AppendHorizontally())
{
horizontal.AutoLevel();
horizontal.Threshold(new Percentage(50));
horizontal.Write(targetPath_working);
}
}
已找到解决我的问题的方法,请参阅下面的代码。必须结合使用多种不同的设置才能获得良好的最终结果。
MagickNET.SetGhostscriptDirectory(_ghostscriptPath);
var settings = new MagickReadSettings();
settings.Density = new Density(_dpi);
settings.SetDefine(MagickFormat.Png, "Bit-depth", "1");
using (var images = new MagickImageCollection())
{
images.Read(sourceFilePath, settings);
using (var horizontal = images.AppendHorizontally())
{
horizontal.AutoLevel();
horizontal.Threshold(new Percentage(50));
horizontal.ColorType = ColorType.Bilevel;
horizontal.Format = MagickFormat.Png8;
horizontal.Write(targetPath_working);
}
}