c# - 使用 Bitmap.Save() 将 TIF 更好地转换为 PNG?

标签 c# bitmap png tiff

更新:试过 SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; 并且在完全缩放时很明显,但它没有解决问题,问题现在只是抗锯齿...

TIF 是扫描文档,包含表格和文本的线条之类的内容。

当前方法:

using System.Drawing;
using System.Drawing.Imaging;    

var image = Image.FromFile(tifFileName);

Image bitmap = new Bitmap(image, (int)(image.Width), (int)(image.Height));

var imageFinal = new Bitmap(image.Width, image.Height);

var graphic = Graphics.FromImage(imageFinal);

graphic.DrawImage(image, 0, 0, image.Width, image.Height);

using(var imgStream = new MemoryStream())
{
    imageFinal.Save(imgStream, ImageFormat.Png);
    return new MemoryStream(imgStream.GetBuffer());
}

但是,它最终看起来像垃圾,例如任何一种略微倾斜的线条都有阶梯的痕迹,而文本等其他精细元素看起来很粗糙。尤其是与使用 GIMP 将 TIF 保存为 PNG 相比,后者看起来很棒。

那么,我可以添加一些东西来使这项工作变得更好吗?还是我必须完全寻找另一种方法?

最佳答案

我的直接印象是你会遇到太多麻烦,因为你没有调整大小:

var image = Image.FromFile(@"C:\Sample.tiff");
image.Save(@"C:\Sample.png", ImageFormat.Png);

如果使用图像类型不能解决混叠问题,请尝试手动选择编码器:

#region Using Directives

using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;

#endregion

namespace TiffToBitmap
{
    internal class Program
    {
        private static void Main()
        {
            // Just save the image.
            SaveImage(@"C:\Sample1.png", "image/tiff");

            // Get a byte array from the converted image.
            var imageBytes = GetBytes("image/tiff");

            // Save it for easy comparison.
            File.WriteAllBytes(@"C:\Sample2.png", imageBytes);
        }

        private static byte[] GetBytes(string mimeType)
        {
            var image = Image.FromFile(@"C:\Sample.tiff");

            var encoders = ImageCodecInfo.GetImageEncoders();
            var imageCodecInfo = encoders.FirstOrDefault(encoder => encoder.MimeType == mimeType);

            if (imageCodecInfo == null)
            {
                return null;
            }

            using (var memoryStream = new MemoryStream())
            {
                var imageEncoderParams = new EncoderParameters(1);
                imageEncoderParams.Param[0] = new EncoderParameter(Encoder.Quality, 100L);
                image.Save(memoryStream, imageCodecInfo, imageEncoderParams);

                return memoryStream.GetBuffer();
            }
        }

        private static void SaveImage(string path, string mimeType)
        {
            var image = Image.FromFile(@"C:\Sample.tiff");

            var encoders = ImageCodecInfo.GetImageEncoders();
            var imageCodecInfo = encoders.FirstOrDefault(encoder => encoder.MimeType == mimeType);

            if (imageCodecInfo == null)
            {
                return;
            }

            var imageEncoderParams = new EncoderParameters(1);
            imageEncoderParams.Param[0] = new EncoderParameter(Encoder.Quality, 100L);
            image.Save(path, imageCodecInfo, imageEncoderParams);
        }
    }
}

关于c# - 使用 Bitmap.Save() 将 TIF 更好地转换为 PNG?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12532538/

相关文章:

c# - 调整位图图像的大小并使线条更粗

png - 是什么让我的 png 膨胀?

c# - 检测 PNG 图像文件是否为透明图像?

C# 位图对象,颜色显示为透明

android - 如何使用 android volley 库将位图图像上传到服务器?

c# - 这是一个有点笼统的查询,但是 ASP.NET 应用程序如何知道请求是来自一台计算机还是另一台计算机?

C#避免装箱和重复代码

Swift Metal 将 bgra8Unorm 纹理保存到 PNG 文件

c# - 具有自定义列的延迟加载 DataGridView

c# - 使用 WebClient 调用服务时获取 JSON 而不是 XML 文件