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);
                }
            }